00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_dgp_nonparametric_h
00013 #define __deal2__fe_dgp_nonparametric_h
00014
00015 #include <deal.II/base/config.h>
00016 #include <deal.II/base/polynomial.h>
00017 #include <deal.II/base/polynomial_space.h>
00018 #include <deal.II/fe/fe.h>
00019
00020 DEAL_II_NAMESPACE_OPEN
00021
00022 template <int dim> class PolynomialSpace;
00023 template <int dim, int spacedim> class MappingQ;
00024
00025
00028
00052 template <int dim, int spacedim=dim>
00053 class FE_DGPNonparametric : public FiniteElement<dim,spacedim>
00054 {
00055 public:
00060 FE_DGPNonparametric (const unsigned int k);
00061
00071 virtual std::string get_name () const;
00072
00082 virtual double shape_value (const unsigned int i,
00083 const Point<dim> &p) const;
00084
00103 virtual double shape_value_component (const unsigned int i,
00104 const Point<dim> &p,
00105 const unsigned int component) const;
00106
00116 virtual Tensor<1,dim> shape_grad (const unsigned int i,
00117 const Point<dim> &p) const;
00118
00137 virtual Tensor<1,dim> shape_grad_component (const unsigned int i,
00138 const Point<dim> &p,
00139 const unsigned int component) const;
00140
00151 virtual Tensor<2,dim> shape_grad_grad (const unsigned int i,
00152 const Point<dim> &p) const;
00153
00172 virtual Tensor<2,dim> shape_grad_grad_component (const unsigned int i,
00173 const Point<dim> &p,
00174 const unsigned int component) const;
00175
00182 unsigned int get_degree () const;
00183
00205 virtual void
00206 get_face_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00207 FullMatrix<double> &matrix) const;
00208
00230 virtual void
00231 get_subface_interpolation_matrix (const FiniteElement<dim,spacedim> &source,
00232 const unsigned int subface,
00233 FullMatrix<double> &matrix) const;
00234
00278 virtual
00279 std::vector<std::pair<unsigned int, unsigned int> >
00280 hp_vertex_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00281
00293 virtual
00294 std::vector<std::pair<unsigned int, unsigned int> >
00295 hp_line_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00296
00308 virtual
00309 std::vector<std::pair<unsigned int, unsigned int> >
00310 hp_quad_dof_identities (const FiniteElement<dim,spacedim> &fe_other) const;
00311
00325 virtual bool hp_constraints_are_implemented () const;
00326
00339 virtual
00340 FiniteElementDomination::Domination
00341 compare_for_face_domination (const FiniteElement<dim,spacedim> &fe_other) const;
00342
00360 virtual bool has_support_on_face (const unsigned int shape_index,
00361 const unsigned int face_index) const;
00362
00374 virtual std::size_t memory_consumption () const;
00375
00376
00377 private:
00388 struct Matrices
00389 {
00396 static const double * const embedding[][GeometryInfo<dim>::max_children_per_cell];
00397
00407 static const unsigned int n_embedding_matrices;
00408
00413 static const double * const projection_matrices[][GeometryInfo<dim>::max_children_per_cell];
00414
00421 static const unsigned int n_projection_matrices;
00422 };
00423
00424 protected:
00425
00433 virtual FiniteElement<dim,spacedim> *clone() const;
00434
00440 virtual
00441 typename Mapping<dim,spacedim>::InternalDataBase *
00442 get_data (const UpdateFlags,
00443 const Mapping<dim,spacedim>& mapping,
00444 const Quadrature<dim>& quadrature) const ;
00445
00451 virtual void
00452 fill_fe_values (const Mapping<dim,spacedim> &mapping,
00453 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00454 const Quadrature<dim> &quadrature,
00455 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00456 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00457 FEValuesData<dim,spacedim> &data,
00458 CellSimilarity::Similarity &cell_similarity) const;
00459
00465 virtual void
00466 fill_fe_face_values (const Mapping<dim,spacedim> &mapping,
00467 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00468 const unsigned int face_no,
00469 const Quadrature<dim-1> &quadrature,
00470 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00471 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00472 FEValuesData<dim,spacedim>& data) const ;
00473
00479 virtual void
00480 fill_fe_subface_values (const Mapping<dim,spacedim> &mapping,
00481 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00482 const unsigned int face_no,
00483 const unsigned int sub_no,
00484 const Quadrature<dim-1> &quadrature,
00485 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00486 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00487 FEValuesData<dim,spacedim>& data) const ;
00488
00489 private:
00490
00501 static std::vector<unsigned int> get_dpo_vector (const unsigned int degree);
00502
00522 virtual UpdateFlags update_once (const UpdateFlags flags) const;
00523
00540 virtual UpdateFlags update_each (const UpdateFlags flags) const;
00541
00545 const unsigned int degree;
00546
00552 const PolynomialSpace<dim> polynomial_space;
00553
00562 class InternalData : public FiniteElement<dim,spacedim>::InternalDataBase
00563 {
00564 public:
00565
00566 std::vector<double> values;
00567 std::vector<Tensor<1,dim> > grads;
00568 std::vector<Tensor<2,dim> > grad_grads;
00569 };
00570
00574 template <int, int> friend class FE_DGPNonparametric;
00575
00581 template <int, int> friend class MappingQ;
00582
00583 };
00584
00587 #ifndef DOXYGEN
00588
00589
00590
00591 #ifndef DEAL_II_MEMBER_VAR_SPECIALIZATION_BUG
00592 template <>
00593 const double * const FE_DGPNonparametric<1,1>::Matrices::embedding[][GeometryInfo<1>::max_children_per_cell];
00594
00595 template <>
00596 const unsigned int FE_DGPNonparametric<1,1>::Matrices::n_embedding_matrices;
00597
00598 template <>
00599 const double * const FE_DGPNonparametric<1,1>::Matrices::projection_matrices[][GeometryInfo<1>::max_children_per_cell];
00600
00601 template <>
00602 const unsigned int FE_DGPNonparametric<1,1>::Matrices::n_projection_matrices;
00603
00604 template <>
00605 const double * const FE_DGPNonparametric<2,2>::Matrices::embedding[][GeometryInfo<2>::max_children_per_cell];
00606
00607 template <>
00608 const unsigned int FE_DGPNonparametric<2,2>::Matrices::n_embedding_matrices;
00609
00610 template <>
00611 const double * const FE_DGPNonparametric<2,2>::Matrices::projection_matrices[][GeometryInfo<2>::max_children_per_cell];
00612
00613 template <>
00614 const unsigned int FE_DGPNonparametric<2,2>::Matrices::n_projection_matrices;
00615
00616 template <>
00617 const double * const FE_DGPNonparametric<3,3>::Matrices::embedding[][GeometryInfo<3>::max_children_per_cell];
00618
00619 template <>
00620 const unsigned int FE_DGPNonparametric<3,3>::Matrices::n_embedding_matrices;
00621
00622 template <>
00623 const double * const FE_DGPNonparametric<3,3>::Matrices::projection_matrices[][GeometryInfo<3>::max_children_per_cell];
00624
00625 template <>
00626 const unsigned int FE_DGPNonparametric<3,3>::Matrices::n_projection_matrices;
00627 #endif
00628
00629 #endif // DOXYGEN
00630
00631 DEAL_II_NAMESPACE_CLOSE
00632
00633 #endif
00634