00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__fe_poly_tensor_h
00013 #define __deal2__fe_poly_tensor_h
00014
00015
00016 #include <deal.II/lac/full_matrix.h>
00017 #include <deal.II/fe/fe.h>
00018 #include <deal.II/base/derivative_form.h>
00019
00020 DEAL_II_NAMESPACE_OPEN
00021
00114 template <class POLY, int dim, int spacedim=dim>
00115 class FE_PolyTensor : public FiniteElement<dim,spacedim>
00116 {
00117 public:
00126 FE_PolyTensor (const unsigned int degree,
00127 const FiniteElementData<dim> &fe_data,
00128 const std::vector<bool> &restriction_is_additive_flags,
00129 const std::vector<std::vector<bool> > &nonzero_components);
00130
00136 virtual double shape_value (const unsigned int i,
00137 const Point<dim> &p) const;
00138
00139 virtual double shape_value_component (const unsigned int i,
00140 const Point<dim> &p,
00141 const unsigned int component) const;
00142
00148 virtual Tensor<1,dim> shape_grad (const unsigned int i,
00149 const Point<dim> &p) const;
00150
00151 virtual Tensor<1,dim> shape_grad_component (const unsigned int i,
00152 const Point<dim> &p,
00153 const unsigned int component) const;
00154
00160 virtual Tensor<2,dim> shape_grad_grad (const unsigned int i,
00161 const Point<dim> &p) const;
00162
00163 virtual Tensor<2,dim> shape_grad_grad_component (const unsigned int i,
00164 const Point<dim> &p,
00165 const unsigned int component) const;
00166
00177 virtual UpdateFlags update_once (const UpdateFlags flags) const;
00188 virtual UpdateFlags update_each (const UpdateFlags flags) const;
00189
00190 protected:
00197 MappingType mapping_type;
00198
00199 virtual
00200 typename Mapping<dim,spacedim>::InternalDataBase *
00201 get_data (const UpdateFlags,
00202 const Mapping<dim,spacedim>& mapping,
00203 const Quadrature<dim>& quadrature) const ;
00204
00205 virtual void
00206 fill_fe_values (const Mapping<dim,spacedim> &mapping,
00207 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00208 const Quadrature<dim> &quadrature,
00209 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00210 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00211 FEValuesData<dim,spacedim> &data,
00212 CellSimilarity::Similarity &cell_similarity) const;
00213
00214 virtual void
00215 fill_fe_face_values (const Mapping<dim,spacedim> &mapping,
00216 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00217 const unsigned int face_no,
00218 const Quadrature<dim-1> &quadrature,
00219 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00220 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00221 FEValuesData<dim,spacedim>& data) const ;
00222
00223 virtual void
00224 fill_fe_subface_values (const Mapping<dim,spacedim> &mapping,
00225 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00226 const unsigned int face_no,
00227 const unsigned int sub_no,
00228 const Quadrature<dim-1> &quadrature,
00229 typename Mapping<dim,spacedim>::InternalDataBase &mapping_internal,
00230 typename Mapping<dim,spacedim>::InternalDataBase &fe_internal,
00231 FEValuesData<dim,spacedim>& data) const ;
00232
00248 class InternalData : public FiniteElement<dim,spacedim>::InternalDataBase
00249 {
00250 public:
00260 std::vector<std::vector<Tensor<1,dim> > > shape_values;
00261
00271 std::vector< std::vector< DerivativeForm<1, dim, spacedim> > > shape_grads;
00272 };
00273
00279 POLY poly_space;
00280
00301 FullMatrix<double> inverse_node_matrix;
00302
00313 mutable Point<dim> cached_point;
00314
00320 mutable std::vector<Tensor<1,dim> > cached_values;
00321
00327 mutable std::vector<Tensor<2,dim> > cached_grads;
00328
00334 mutable std::vector<Tensor<3,dim> > cached_grad_grads;
00335 };
00336
00337 DEAL_II_NAMESPACE_CLOSE
00338
00339 #endif
00340