00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_nedelec_h
00013 #define __deal2__fe_nedelec_h
00014
00015 #include <deal.II/base/config.h>
00016 #include <deal.II/base/table.h>
00017 #include <deal.II/base/tensor.h>
00018 #include <deal.II/base/tensor_base.h>
00019 #include <deal.II/base/polynomials_nedelec.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 #include <vector>
00026
00027 DEAL_II_NAMESPACE_OPEN
00028
00029 template <int dim, int spacedim> class MappingQ;
00030
00031
00034
00153 template <int dim>
00154 class FE_Nedelec : public FE_PolyTensor<PolynomialsNedelec<dim>, dim>
00155 {
00156 public:
00161 FE_Nedelec (const unsigned int p);
00162
00172 virtual std::string get_name () const;
00173
00174
00179 virtual bool has_support_on_face (const unsigned int shape_index,
00180 const unsigned int face_index) const;
00181
00192 virtual bool hp_constraints_are_implemented () const;
00193
00198 virtual FiniteElementDomination::Domination
00199 compare_for_face_domination (const FiniteElement<dim>& fe_other) const;
00221 virtual std::vector<std::pair<unsigned int, unsigned int> >
00222 hp_vertex_dof_identities (const FiniteElement<dim>& fe_other) const;
00223
00228 virtual std::vector<std::pair<unsigned int, unsigned int> >
00229 hp_line_dof_identities (const FiniteElement<dim>& fe_other) const;
00230
00235 virtual std::vector<std::pair<unsigned int, unsigned int> >
00236 hp_quad_dof_identities (const FiniteElement<dim>& fe_other) const;
00237
00251 virtual void
00252 get_face_interpolation_matrix (const FiniteElement<dim>& source,
00253 FullMatrix<double>& matrix) const;
00254
00268 virtual void
00269 get_subface_interpolation_matrix (const FiniteElement<dim>& source,
00270 const unsigned int subface,
00271 FullMatrix<double>& matrix) const;
00272
00273 virtual void interpolate (std::vector<double>& local_dofs,
00274 const std::vector<double>& values) const;
00275
00276 virtual void interpolate (std::vector<double>& local_dofs,
00277 const std::vector<Vector<double> >& values,
00278 unsigned int offset = 0) const;
00279 virtual void interpolate (std::vector<double>& local_dofs,
00280 const VectorSlice<const std::vector<std::vector<double> > >& values)
00281 const;
00282 virtual std::size_t memory_consumption () const;
00283 virtual FiniteElement<dim> * clone() const;
00284
00285 private:
00303 static std::vector<unsigned int>
00304 get_dpo_vector (const unsigned int degree, bool dg=false);
00305
00316 void initialize_support_points (const unsigned int degree);
00317
00329 void initialize_restriction ();
00330
00339 class InternalData : public FiniteElement<dim>::InternalDataBase
00340 {
00341 public:
00365 std::vector<std::vector<Tensor<1, dim> > > shape_values;
00366
00385 std::vector<std::vector<Tensor<2, dim> > > shape_gradients;
00386 };
00387
00396 Table<2, double> boundary_weights;
00397
00402 template <int dim1> friend class FE_Nedelec;
00403 };
00404
00405
00406
00407 #ifndef DOXYGEN
00408
00409 template <>
00410 void
00411 FE_Nedelec<1>::initialize_restriction();
00412
00413 #endif // DOXYGEN
00414
00417 DEAL_II_NAMESPACE_CLOSE
00418
00419 #endif
00420