00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_dg_vector_h
00013 #define __deal2__fe_dg_vector_h
00014
00015 #include <deal.II/base/config.h>
00016 #include <deal.II/base/table.h>
00017 #include <deal.II/base/polynomials_raviart_thomas.h>
00018 #include <deal.II/base/polynomials_nedelec.h>
00019 #include <deal.II/base/polynomials_bdm.h>
00020 #include <deal.II/base/polynomial.h>
00021 #include <deal.II/base/tensor_product_polynomials.h>
00022 #include <deal.II/base/geometry_info.h>
00023 #include <deal.II/fe/fe.h>
00024 #include <deal.II/fe/fe_poly_tensor.h>
00025
00026 #include <vector>
00027
00028 DEAL_II_NAMESPACE_OPEN
00029
00030 template <int dim, int spacedim> class MappingQ;
00031
00032
00051 template <class POLY, int dim, int spacedim=dim>
00052 class FE_DGVector
00053 :
00054 public FE_PolyTensor<POLY, dim, spacedim>
00055 {
00056 public:
00061 FE_DGVector (const unsigned int p, MappingType m);
00062 public:
00063
00064 FiniteElement<dim, spacedim>* clone() const;
00065
00075 virtual std::string get_name () const;
00076
00077
00085 virtual bool has_support_on_face (const unsigned int shape_index,
00086 const unsigned int face_index) const;
00087
00088 virtual void interpolate(std::vector<double>& local_dofs,
00089 const std::vector<double>& values) const;
00090 virtual void interpolate(std::vector<double>& local_dofs,
00091 const std::vector<Vector<double> >& values,
00092 unsigned int offset = 0) const;
00093 virtual void interpolate(
00094 std::vector<double>& local_dofs,
00095 const VectorSlice<const std::vector<std::vector<double> > >& values) const;
00096 virtual std::size_t memory_consumption () const;
00097
00098 private:
00109 static std::vector<unsigned int>
00110 get_dpo_vector (const unsigned int degree);
00111
00120 void initialize_support_points (const unsigned int degree);
00121
00133 void initialize_restriction ();
00134
00143 class InternalData : public FiniteElement<dim>::InternalDataBase
00144 {
00145 public:
00169 std::vector<std::vector<Tensor<1,dim> > > shape_values;
00170
00189 std::vector<std::vector<Tensor<2,dim> > > shape_gradients;
00190 };
00191 Table<3, double> interior_weights;
00192 };
00193
00194
00195
00203 template <int dim, int spacedim=dim>
00204 class FE_DGNedelec : public FE_DGVector<PolynomialsNedelec<dim>, dim, spacedim>
00205 {
00206 public:
00211 FE_DGNedelec (const unsigned int p);
00212
00222 virtual std::string get_name () const;
00223 };
00224
00225
00226
00234 template <int dim, int spacedim=dim>
00235 class FE_DGRaviartThomas : public FE_DGVector<PolynomialsRaviartThomas<dim>, dim, spacedim>
00236 {
00237 public:
00242 FE_DGRaviartThomas (const unsigned int p);
00243
00253 virtual std::string get_name () const;
00254 };
00255
00256
00257
00265 template <int dim, int spacedim=dim>
00266 class FE_DGBDM : public FE_DGVector<PolynomialsBDM<dim>, dim, spacedim>
00267 {
00268 public:
00273 FE_DGBDM (const unsigned int p);
00274
00284 virtual std::string get_name () const;
00285 };
00286
00287
00288 DEAL_II_NAMESPACE_CLOSE
00289
00290 #endif
00291