00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__mapping_q_h
00013 #define __deal2__mapping_q_h
00014
00015
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/table.h>
00018 #include <deal.II/fe/mapping_q1.h>
00019 #include <deal.II/fe/fe_q.h>
00020
00021 DEAL_II_NAMESPACE_OPEN
00022
00023 template <int dim> class TensorProductPolynomials;
00024
00025
00028
00044 template <int dim, int spacedim=dim>
00045 class MappingQ : public MappingQ1<dim,spacedim>
00046 {
00047 public:
00074 MappingQ (const unsigned int p,
00075 const bool use_mapping_q_on_all_cells = false);
00076
00085 MappingQ (const MappingQ<dim,spacedim> &mapping);
00086
00090 virtual ~MappingQ ();
00091
00098 virtual Point<spacedim>
00099 transform_unit_to_real_cell (
00100 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00101 const Point<dim> &p) const;
00102
00120 virtual Point<dim>
00121 transform_real_to_unit_cell (
00122 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00123 const Point<spacedim> &p) const;
00124
00125 virtual void
00126 transform (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00127 VectorSlice<std::vector<Tensor<1,spacedim> > > output,
00128 const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00129 const MappingType type) const;
00130
00131 virtual void
00132 transform (const VectorSlice<const std::vector<DerivativeForm<1, dim, spacedim> > > input,
00133 VectorSlice<std::vector<Tensor<2,spacedim> > > output,
00134 const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00135 const MappingType type) const;
00136
00137 virtual
00138 void
00139 transform (const VectorSlice<const std::vector<Tensor<2, dim> > > input,
00140 VectorSlice<std::vector<Tensor<2,spacedim> > > output,
00141 const typename Mapping<dim,spacedim>::InternalDataBase &internal,
00142 const MappingType type) const;
00143
00149 unsigned int get_degree () const;
00150
00156 virtual
00157 Mapping<dim,spacedim> * clone () const;
00158
00163 class InternalData : public MappingQ1<dim,spacedim>::InternalData
00164 {
00165 public:
00169 InternalData (const unsigned int n_shape_functions);
00170
00171
00178 virtual std::size_t memory_consumption () const;
00179
00191 std::vector<std::vector<Point<dim> > > unit_normals;
00192
00204 bool use_mapping_q1_on_current_cell;
00205
00210 typename MappingQ1<dim,spacedim>::InternalData mapping_q1_data;
00211 };
00212
00213 protected:
00218 virtual void
00219 fill_fe_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00220 const Quadrature<dim> &quadrature,
00221 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00222 typename std::vector<Point<spacedim> > &quadrature_points,
00223 std::vector<double> &JxW_values,
00224 std::vector<DerivativeForm<1,dim,spacedim> > &jacobians,
00225 std::vector<DerivativeForm<2,dim,spacedim> > &jacobian_grads,
00226 std::vector<DerivativeForm<1,spacedim,dim> > &inverse_jacobians,
00227 std::vector<Point<spacedim> > &cell_normal_vectors,
00228 CellSimilarity::Similarity &cell_similarity) const ;
00229
00234 virtual void
00235 fill_fe_face_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00236 const unsigned int face_no,
00237 const Quadrature<dim-1>& quadrature,
00238 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00239 typename std::vector<Point<spacedim> > &quadrature_points,
00240 std::vector<double> &JxW_values,
00241 typename std::vector<Tensor<1,spacedim> > &exterior_form,
00242 typename std::vector<Point<spacedim> > &normal_vectors) const ;
00243
00248 virtual void
00249 fill_fe_subface_values (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00250 const unsigned int face_no,
00251 const unsigned int sub_no,
00252 const Quadrature<dim-1>& quadrature,
00253 typename Mapping<dim,spacedim>::InternalDataBase &mapping_data,
00254 typename std::vector<Point<spacedim> > &quadrature_points,
00255 std::vector<double> &JxW_values,
00256 typename std::vector<Tensor<1,spacedim> > &exterior_form,
00257 typename std::vector<Point<spacedim> > &normal_vectors) const ;
00258
00282 virtual void
00283 add_line_support_points (const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00284 std::vector<Point<spacedim> > &a) const;
00285
00310 virtual void
00311 add_quad_support_points(const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00312 std::vector<Point<spacedim> > &a) const;
00313
00314 private:
00315
00316 virtual
00317 typename Mapping<dim,spacedim>::InternalDataBase *
00318 get_data (const UpdateFlags,
00319 const Quadrature<dim>& quadrature) const;
00320
00321 virtual
00322 typename Mapping<dim,spacedim>::InternalDataBase *
00323 get_face_data (const UpdateFlags flags,
00324 const Quadrature<dim-1>& quadrature) const;
00325
00326 virtual
00327 typename Mapping<dim,spacedim>::InternalDataBase *
00328 get_subface_data (const UpdateFlags flags,
00329 const Quadrature<dim-1>& quadrature) const;
00330
00335 virtual void
00336 compute_shapes_virtual (const std::vector<Point<dim> > &unit_points,
00337 typename MappingQ1<dim,spacedim>::InternalData &data) const;
00338
00356 void
00357 set_laplace_on_quad_vector(Table<2,double> &loqvs) const;
00358
00375 void set_laplace_on_hex_vector(Table<2,double> &lohvs) const;
00376
00391 void compute_laplace_vector(Table<2,double> &lvs) const;
00392
00411 void apply_laplace_vector(const Table<2,double> &lvs,
00412 std::vector<Point<spacedim> > &a) const;
00413
00418 virtual void compute_mapping_support_points(
00419 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00420 std::vector<Point<spacedim> > &a) const;
00421
00436 void compute_support_points_laplace(
00437 const typename Triangulation<dim,spacedim>::cell_iterator &cell,
00438 std::vector<Point<spacedim> > &a) const;
00439
00460 Table<2,double> laplace_on_quad_vector;
00461
00472 Table<2,double> laplace_on_hex_vector;
00473
00477 DeclException1 (ExcLaplaceVectorNotSet,
00478 int,
00479 << "laplace_vector not set for degree=" << arg1 << ".");
00480
00487 const unsigned int degree;
00488
00493 const unsigned int n_inner;
00494
00499 const unsigned int n_outer;
00500
00509 const TensorProductPolynomials<dim> *tensor_pols;
00510
00515 const unsigned int n_shape_functions;
00516
00523 const std::vector<unsigned int> renumber;
00524
00531 const bool use_mapping_q_on_all_cells;
00532
00544 const FE_Q<dim> feq;
00545 };
00546
00549
00550
00551 #ifndef DOXYGEN
00552
00553 template<> MappingQ<1>::MappingQ (const unsigned int,
00554 const bool);
00555 template<> MappingQ<1>::~MappingQ ();
00556 template<> void MappingQ<1>::compute_shapes_virtual (
00557 const std::vector<Point<1> > &unit_points,
00558 MappingQ1<1>::InternalData &data) const;
00559 template <> void MappingQ<1>::set_laplace_on_quad_vector(
00560 Table<2,double> &) const;
00561 template <> void MappingQ<3>::set_laplace_on_hex_vector(
00562 Table<2,double> &lohvs) const;
00563 template <> void MappingQ<1>::compute_laplace_vector(
00564 Table<2,double> &) const;
00565 template <> void MappingQ<1>::add_line_support_points (
00566 const Triangulation<1>::cell_iterator &,
00567 std::vector<Point<1> > &) const;
00568 template<> void MappingQ<3>::add_quad_support_points(
00569 const Triangulation<3>::cell_iterator &cell,
00570 std::vector<Point<3> > &a) const;
00571
00572 #endif // DOXYGEN
00573
00574 DEAL_II_NAMESPACE_CLOSE
00575
00576 #endif
00577