00001 #ifndef _deal2__mymapping_q1_h
00002 #define _deal2__mymapping_q1_h
00003
00004
00005 #include <base/config.h>
00006 #include <base/table.h>
00007 #include <base/qprojector.h>
00008 #include <grid/tria_iterator.h>
00009 #include <dofs/dof_accessor.h>
00010 #include <fe/mapping.h>
00011
00012 #include <cmath>
00013 #include <iostream>
00014
00015 using namespace dealii;
00016
00024 template <int dim>
00025 class MyMappingQ1 : public Mapping<dim>
00026 {
00027 public:
00031 MyMappingQ1 ();
00032
00033 virtual Point<dim>
00034 transform_unit_to_real_cell (
00035 const typename Triangulation<dim>::cell_iterator &cell,
00036 const Point<dim> &p) const;
00037
00048 virtual Point<dim>
00049 transform_real_to_unit_cell (
00050 const typename Triangulation<dim>::cell_iterator &cell,
00051 const Point<dim> &p) const;
00052
00053
00054 virtual void
00055 transform_covariant (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00056 const unsigned int offset,
00057 VectorSlice<std::vector<Tensor<1,dim> > > output,
00058 const typename Mapping<dim>::InternalDataBase &internal) const;
00059
00060
00061 virtual void
00062 transform_covariant (const VectorSlice<const std::vector<Tensor<2,dim> > > input,
00063 const unsigned int offset,
00064 VectorSlice<std::vector<Tensor<2,dim> > > output,
00065 const typename Mapping<dim>::InternalDataBase &internal) const;
00066
00067
00068 virtual void
00069 transform_contravariant (const VectorSlice<const std::vector<Tensor<1,dim> > > input,
00070 const unsigned int offset,
00071 VectorSlice<std::vector<Tensor<1,dim> > > output,
00072 const typename Mapping<dim>::InternalDataBase &internal) const;
00073
00074
00075 virtual void
00076 transform_contravariant (const VectorSlice<const std::vector<Tensor<2,dim> > > input,
00077 const unsigned int offset,
00078 VectorSlice<std::vector<Tensor<2,dim> > > output,
00079 const typename Mapping<dim>::InternalDataBase &internal) const;
00080
00081
00082 virtual UpdateFlags update_once (const UpdateFlags flags) const;
00083
00084
00085 virtual UpdateFlags update_each (const UpdateFlags flags) const;
00086
00093 virtual
00094 Mapping<dim> * clone () const;
00095
00100 class InternalData : public Mapping<dim>::InternalDataBase
00101 {
00102 public:
00107 InternalData(const unsigned int n_shape_functions);
00108
00116 double shape (const unsigned int qpoint,
00117 const unsigned int shape_nr) const;
00118
00123 double &shape (const unsigned int qpoint,
00124 const unsigned int shape_nr);
00125
00133 double support_shape (const unsigned int point_no,
00134 const unsigned int shape_nr) const;
00135
00140 double &support_shape (const unsigned int point_no,
00141 const unsigned int shape_nr);
00142
00148 Tensor<1,dim> derivative (const unsigned int qpoint,
00149 const unsigned int shape_nr) const;
00150
00156 Tensor<1,dim> &derivative (const unsigned int qpoint,
00157 const unsigned int shape_nr);
00158
00164 Tensor<1,dim> support_derivative (const unsigned int point_no,
00165 const unsigned int shape_nr) const;
00166
00172 Tensor<1,dim> &support_derivative (const unsigned int point_no,
00173 const unsigned int shape_nr);
00174
00181 virtual unsigned int memory_consumption () const;
00182
00190 std::vector<double> shape_values;
00191
00199 std::vector<Tensor<1,dim> > shape_derivatives;
00200
00214 std::vector<Tensor<2,dim> > covariant;
00215
00227 std::vector<Tensor<2,dim> > contravariant;
00228
00237 std::vector<double> support_values;
00238
00248 std::vector<Tensor<1,dim> > support_derivatives;
00249
00258 std::vector<std::vector<Tensor<1,dim> > > unit_tangentials;
00259
00263 std::vector<std::vector<Tensor<1,dim> > > aux;
00264
00270 std::vector<Point<dim> > mapping_support_points;
00271
00277 std::vector<Point<dim> > mapping_generalized_support_points;
00278
00284 typename Triangulation<dim>::cell_iterator cell_of_current_support_points;
00285
00293 bool is_mapping_q1_data;
00294
00308 unsigned int n_shape_functions;
00309 };
00310
00311 DeclException0 (ExcAccessToUninitializedField);
00312
00313 protected:
00314
00322 typedef
00323 typename QProjector<dim>::DataSetDescriptor
00324 DataSetDescriptor;
00325
00326
00327
00328
00329
00330
00331
00332
00337 virtual void
00338 fill_fe_values (
00339 const typename Triangulation<dim>::cell_iterator &cell,
00340 const Quadrature<dim> &quadrature,
00341 typename Mapping<dim>::InternalDataBase &mapping_data,
00342 typename std::vector<Point<dim> > &quadrature_points,
00343 std::vector<double> &JxW_values,
00344 std::vector<Tensor<2,dim> > &jacobians,
00345 std::vector<Tensor<3,dim> > &jacobian_grads,
00346 std::vector< Tensor< 2, dim > > &inverse_jacobians) const;
00347
00352 virtual void
00353 fill_fe_face_values (const typename Triangulation<dim>::cell_iterator &cell,
00354 const unsigned int face_no,
00355 const Quadrature<dim-1>& quadrature,
00356 typename Mapping<dim>::InternalDataBase &mapping_data,
00357 typename std::vector<Point<dim> > &quadrature_points,
00358 std::vector<double> &JxW_values,
00359 typename std::vector<Tensor<1,dim> > &boundary_form,
00360 typename std::vector<Point<dim> > &normal_vectors,
00361 std::vector<double> &cell_JxW_values) const ;
00362
00367 virtual void
00368 fill_fe_subface_values (const typename Triangulation<dim>::cell_iterator &cell,
00369 const unsigned int face_no,
00370 const unsigned int sub_no,
00371 const Quadrature<dim-1>& quadrature,
00372 typename Mapping<dim>::InternalDataBase &mapping_data,
00373 typename std::vector<Point<dim> > &quadrature_points,
00374 std::vector<double> &JxW_values,
00375 typename std::vector<Tensor<1,dim> > &boundary_form,
00376 typename std::vector<Point<dim> > &normal_vectors,
00377 std::vector<double> &cell_JxW_values) const ;
00378
00391 void compute_shapes (
00392 const std::vector<Point<dim> > &quadrature_points,
00393 InternalData &data) const;
00394
00403 void compute_data (
00404 const UpdateFlags flags,
00405 const std::vector<Point<dim> > &quadrature_points,
00406 const unsigned int n_orig_q_points,
00407 InternalData &data) const;
00408
00409
00410
00411
00412
00413
00414
00415
00428 void compute_face_data (
00429 const UpdateFlags flags,
00430 const Quadrature<dim> &quadrature,
00431 const unsigned int n_orig_q_points,
00432 InternalData &data) const;
00433
00438 void compute_fill (const typename Triangulation<dim>::cell_iterator &cell,
00439 const unsigned int npts,
00440 const DataSetDescriptor data_set,
00441 InternalData &data,
00442 std::vector<Point<dim> > &quadrature_points) const;
00443
00448 void compute_fill_face (const typename Triangulation<dim>::cell_iterator &cell,
00449 const unsigned int face_no,
00450 const bool is_subface,
00451 const unsigned int npts,
00452 const DataSetDescriptor data_set,
00453 const std::vector<double> &weights,
00454 InternalData &mapping_data,
00455 std::vector<Point<dim> > &quadrature_points,
00456 std::vector<double> &JxW_values,
00457 std::vector<Tensor<1,dim> > &boundary_form,
00458 std::vector<Point<dim> > &normal_vectors,
00459 std::vector<double> &cell_JxW_values) const;
00460
00465 virtual void compute_shapes_virtual (
00466 const std::vector<Point<dim> > &quadrature_points,
00467 InternalData &data) const;
00468
00495 Point<dim> transform_unit_to_real_cell_internal (const InternalData &mdata) const;
00496
00531 void transform_real_to_unit_cell_internal (const typename Triangulation<dim>::cell_iterator &cell,
00532 const Point<dim> &p,
00533 InternalData &mdata,
00534 Point<dim> &p_unit) const;
00535
00536 private:
00537 virtual
00538 typename Mapping<dim>::InternalDataBase *
00539 get_data (
00540 const UpdateFlags,
00541 const Quadrature<dim> & quadrature) const;
00542
00543
00544
00545
00546
00547
00548
00549
00550 virtual
00551 typename Mapping<dim>::InternalDataBase *
00552 get_face_data (const UpdateFlags flags,
00553 const Quadrature<dim-1>& quadrature) const;
00554
00555 virtual
00556 typename Mapping<dim>::InternalDataBase *
00557 get_subface_data (const UpdateFlags flags,
00558 const Quadrature<dim-1>& quadrature) const;
00559
00576 virtual void compute_mapping_support_points(
00577 const typename Triangulation<dim>::cell_iterator &cell,
00578 std::vector<Point<dim> > &a) const;
00579
00585 static const unsigned int n_shape_functions = GeometryInfo<dim>::vertices_per_cell;
00586 };
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599 template<int dim>
00600 inline
00601 double
00602 MyMappingQ1<dim>::InternalData::shape (const unsigned int qpoint,
00603 const unsigned int shape_nr) const
00604 {
00605 Assert(qpoint*n_shape_functions + shape_nr < shape_values.size(),
00606 ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00607 shape_values.size()));
00608 return shape_values [qpoint*n_shape_functions + shape_nr];
00609 }
00610
00611
00612
00613 template <int dim>
00614 inline
00615 double &
00616 MyMappingQ1<dim>::InternalData::shape (const unsigned int qpoint,
00617 const unsigned int shape_nr)
00618 {
00619 Assert(qpoint*n_shape_functions + shape_nr < shape_values.size(),
00620 ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00621 shape_values.size()));
00622 return shape_values [qpoint*n_shape_functions + shape_nr];
00623 }
00624
00625 template<int dim>
00626 inline
00627 double
00628 MyMappingQ1<dim>::InternalData::support_shape (const unsigned int point_no,
00629 const unsigned int shape_nr) const
00630 {
00631 Assert(point_no*n_shape_functions + shape_nr < support_values.size(),
00632 ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00633 support_values.size()));
00634 return support_values [point_no*n_shape_functions + shape_nr];
00635 }
00636
00637
00638
00639 template <int dim>
00640 inline
00641 double &
00642 MyMappingQ1<dim>::InternalData::support_shape (const unsigned int point_no,
00643 const unsigned int shape_nr)
00644 {
00645 Assert(point_no*n_shape_functions + shape_nr < support_values.size(),
00646 ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00647 support_values.size()));
00648 return support_values [point_no*n_shape_functions + shape_nr];
00649 }
00650
00651 template <int dim>
00652 inline
00653 Tensor<1,dim>
00654 MyMappingQ1<dim>::InternalData::derivative (const unsigned int qpoint,
00655 const unsigned int shape_nr) const
00656 {
00657 Assert(qpoint*n_shape_functions + shape_nr < shape_derivatives.size(),
00658 ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00659 shape_derivatives.size()));
00660 return shape_derivatives [qpoint*n_shape_functions + shape_nr];
00661 }
00662
00663 template <int dim>
00664 inline
00665 Tensor<1,dim> &
00666 MyMappingQ1<dim>::InternalData::derivative (const unsigned int qpoint,
00667 const unsigned int shape_nr)
00668 {
00669 Assert(qpoint*n_shape_functions + shape_nr < shape_derivatives.size(),
00670 ExcIndexRange(qpoint*n_shape_functions + shape_nr, 0,
00671 shape_derivatives.size()));
00672 return shape_derivatives [qpoint*n_shape_functions + shape_nr];
00673 }
00674
00675 template <int dim>
00676 inline
00677 Tensor<1,dim>
00678 MyMappingQ1<dim>::InternalData::support_derivative (const unsigned int point_no,
00679 const unsigned int shape_nr) const
00680 {
00681 Assert(point_no*n_shape_functions + shape_nr < support_derivatives.size(),
00682 ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00683 support_derivatives.size()));
00684 return support_derivatives [point_no*n_shape_functions + shape_nr];
00685 }
00686
00687 template <int dim>
00688 inline
00689 Tensor<1,dim> &
00690 MyMappingQ1<dim>::InternalData::support_derivative (const unsigned int point_no,
00691 const unsigned int shape_nr)
00692 {
00693 Assert(point_no*n_shape_functions + shape_nr < support_derivatives.size(),
00694 ExcIndexRange(point_no*n_shape_functions + shape_nr, 0,
00695 support_derivatives.size()));
00696 return support_derivatives [point_no*n_shape_functions + shape_nr];
00697 }
00698
00699
00700
00701
00702 #ifndef DOXYGEN
00703
00704 template<> void MyMappingQ1<1>::compute_shapes_virtual (
00705 const std::vector<Point<1> > &quadrature_points,
00706 InternalData& data) const;
00707 template<> void MyMappingQ1<2>::compute_shapes_virtual (
00708 const std::vector<Point<2> > &quadrature_points,
00709 InternalData &data) const;
00710 template<> void MyMappingQ1<3>::compute_shapes_virtual (
00711 const std::vector<Point<3> > &quadrature_points,
00712 InternalData &data) const;
00713
00714 template <>
00715 void
00716 MyMappingQ1<1>::compute_face_data (const UpdateFlags,
00717 const Quadrature<1> &,
00718 const unsigned int,
00719 InternalData &) const;
00720
00721 template <> void MyMappingQ1<1>::compute_fill_face (
00722 const Triangulation<1>::cell_iterator &,
00723 const unsigned int,
00724 const bool,
00725 const unsigned int,
00726 const DataSetDescriptor,
00727 const std::vector<double> &,
00728 InternalData &,
00729 std::vector<Point<1> > &,
00730 std::vector<double> &,
00731 std::vector<Tensor<1,1> > &,
00732 std::vector<Point<1> > &,
00733 std::vector<double> &) const;
00734
00735 template <> void MyMappingQ1<1>::fill_fe_face_values (
00736 const Triangulation<1>::cell_iterator &,
00737 const unsigned,
00738 const Quadrature<0>&,
00739 Mapping<1>::InternalDataBase&,
00740 std::vector<Point<1> >&,
00741 std::vector<double>&,
00742 std::vector<Tensor<1,1> >&,
00743 std::vector<Point<1> >&,
00744 std::vector<double>&) const;
00745
00746 template <> void MyMappingQ1<1>::fill_fe_subface_values (
00747 const Triangulation<1>::cell_iterator &,
00748 const unsigned,
00749 const unsigned,
00750 const Quadrature<0>&,
00751 Mapping<1>::InternalDataBase&,
00752 std::vector<Point<1> >&,
00753 std::vector<double>&,
00754 std::vector<Tensor<1,1> >&,
00755 std::vector<Point<1> >&,
00756 std::vector<double>&) const;
00757
00758 #endif // DOXYGEN
00759
00760 #endif // _deal2__mymapping_q1_h