All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
integration_info.h
1 //---------------------------------------------------------------------------
2 // @f$Id: integration_info.h 29226 2013-04-09 19:09:20Z bangerth @f$
3 //
4 // Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 by the deal.II authors
5 //
6 // This file is subject to QPL and may not be distributed
7 // without copyright and license information. Please refer
8 // to the file deal.II/doc/license.html for the text and
9 // further information on this license.
10 //
11 //---------------------------------------------------------------------------
12 
13 #ifndef __deal2__mesh_worker_integration_info_h
14 #define __deal2__mesh_worker_integration_info_h
15 
16 #include <deal.II/base/config.h>
17 #include <deal.II/base/quadrature_lib.h>
18 #include <deal.II/base/std_cxx1x/shared_ptr.h>
19 #include <deal.II/dofs/block_info.h>
20 #include <deal.II/fe/fe_values.h>
21 #include <deal.II/meshworker/local_results.h>
22 #include <deal.II/meshworker/dof_info.h>
23 #include <deal.II/meshworker/vector_selector.h>
24 
25 DEAL_II_NAMESPACE_OPEN
26 
27 namespace MeshWorker
28 {
72  template<int dim, int spacedim = dim>
74  {
75  private:
77  std::vector<std_cxx1x::shared_ptr<FEValuesBase<dim, spacedim> > > fevalv;
78  public:
79  static const unsigned int dimension = dim;
80  static const unsigned int space_dimension = spacedim;
81 
86 
93 
127  template <class FEVALUES>
129  const Mapping<dim,spacedim> &mapping,
131  const UpdateFlags flags,
132  const BlockInfo *local_block_info = 0);
133 
139  void initialize_data(const std_cxx1x::shared_ptr<VectorDataBase<dim,spacedim> > &data);
140 
144  void clear();
145 
147  bool multigrid;
149 
158  const FEValuesBase<dim, spacedim> &fe_values () const;
159 
161 
169  const FEValuesBase<dim, spacedim> &fe_values (const unsigned int i) const;
170 
185  std::vector<std::vector<std::vector<double> > > values;
186 
201  std::vector<std::vector<std::vector<Tensor<1,dim> > > > gradients;
202 
217  std::vector<std::vector<std::vector<Tensor<2,dim> > > > hessians;
218 
223  template <typename number>
224  void reinit(const DoFInfo<dim, spacedim, number> &i);
225 
233  template<typename number>
234  void fill_local_data(const DoFInfo<dim, spacedim, number> &info, bool split_fevalues);
235 
242  std_cxx1x::shared_ptr<VectorDataBase<dim, spacedim> > global_data;
243 
247  std::size_t memory_consumption () const;
248 
249  private:
259  template <typename TYPE>
260  void fill_local_data(
261  std::vector<std::vector<std::vector<TYPE> > > &data,
262  VectorSelector &selector,
263  bool split_fevalues) const;
268  unsigned int n_components;
269  };
270 
327  template <int dim, int spacedim=dim>
329  {
330  public:
331 
337 
342 
357  const Mapping<dim, spacedim> &mapping,
358  const BlockInfo *block_info = 0);
359 
373  template <typename VECTOR>
375  const Mapping<dim, spacedim> &mapping,
376  const NamedData<VECTOR *> &data,
377  const BlockInfo *block_info = 0);
378 
392  template <typename VECTOR>
394  const Mapping<dim, spacedim> &mapping,
395  const NamedData<MGLevelObject<VECTOR>*> &data,
396  const BlockInfo *block_info = 0);
400  /* @{ */
401 
422  void initialize_update_flags(bool neighbor_geometry = false);
423 
430  void add_update_flags_all (const UpdateFlags flags);
431 
436  void add_update_flags_cell(const UpdateFlags flags);
437 
442  void add_update_flags_boundary(const UpdateFlags flags);
443 
448  void add_update_flags_face(const UpdateFlags flags);
449 
462  void add_update_flags(const UpdateFlags flags,
463  const bool cell = true,
464  const bool boundary = true,
465  const bool face = true,
466  const bool neighbor = true);
467 
484  void initialize_gauss_quadrature(unsigned int n_cell_points,
485  unsigned int n_boundary_points,
486  unsigned int n_face_points,
487  const bool force = true);
488 
492  std::size_t memory_consumption () const;
493 
511 
521 
532 
538 
544 
550  /* @} */
551 
555  /* @{ */
556 
582 
591 
600 
601  std_cxx1x::shared_ptr<MeshWorker::VectorDataBase<dim, spacedim> > cell_data;
602  std_cxx1x::shared_ptr<MeshWorker::VectorDataBase<dim, spacedim> > boundary_data;
603  std_cxx1x::shared_ptr<MeshWorker::VectorDataBase<dim, spacedim> > face_data;
604  /* @} */
605 
609  /* @{ */
642  template <class DOFINFO>
643  void post_cell(const DoFInfoBox<dim, DOFINFO> &);
644 
675  template <class DOFINFO>
676  void post_faces(const DoFInfoBox<dim, DOFINFO> &);
677 
706 
707  /* @} */
708  };
709 
710 
711 //----------------------------------------------------------------------//
712 
713  template<int dim, int sdim>
714  inline
716  :
717  fevalv(0),
718  multigrid(false),
719  global_data(std_cxx1x::shared_ptr<VectorDataBase<dim, sdim> >(new VectorDataBase<dim, sdim>))
720  {}
721 
722 
723  template<int dim, int sdim>
724  inline
726  :
727  multigrid(other.multigrid),
728  values(other.values),
729  gradients(other.gradients),
730  hessians(other.hessians),
731  global_data(other.global_data),
732  n_components(other.n_components)
733  {
734  fevalv.resize(other.fevalv.size());
735  for (unsigned int i=0; i<other.fevalv.size(); ++i)
736  {
737  const FEValuesBase<dim,sdim> &p = *other.fevalv[i];
738  const FEValues<dim,sdim> *pc = dynamic_cast<const FEValues<dim,sdim>*>(&p);
739  const FEFaceValues<dim,sdim> *pf = dynamic_cast<const FEFaceValues<dim,sdim>*>(&p);
740  const FESubfaceValues<dim,sdim> *ps = dynamic_cast<const FESubfaceValues<dim,sdim>*>(&p);
741 
742  if (pc != 0)
743  fevalv[i] = std_cxx1x::shared_ptr<FEValuesBase<dim,sdim> > (
744  new FEValues<dim,sdim> (pc->get_mapping(), pc->get_fe(),
745  pc->get_quadrature(), pc->get_update_flags()));
746  else if (pf != 0)
747  fevalv[i] = std_cxx1x::shared_ptr<FEValuesBase<dim,sdim> > (
748  new FEFaceValues<dim,sdim> (pf->get_mapping(), pf->get_fe(), pf->get_quadrature(), pf->get_update_flags()));
749  else if (ps != 0)
750  fevalv[i] = std_cxx1x::shared_ptr<FEValuesBase<dim,sdim> > (
752  else
753  Assert(false, ExcInternalError());
754  }
755  }
756 
757 
758 
759  template<int dim, int sdim>
760  template <class FEVALUES>
761  inline void
763  const FiniteElement<dim,sdim> &el,
764  const Mapping<dim,sdim> &mapping,
766  const UpdateFlags flags,
767  const BlockInfo *block_info)
768  {
769  if (block_info == 0 || block_info->local().size() == 0)
770  {
771  fevalv.resize(1);
772  fevalv[0] = std_cxx1x::shared_ptr<FEValuesBase<dim,sdim> > (
773  new FEVALUES (mapping, el, quadrature, flags));
774  }
775  else
776  {
777  fevalv.resize(el.n_base_elements());
778  for (unsigned int i=0; i<fevalv.size(); ++i)
779  {
780  fevalv[i] = std_cxx1x::shared_ptr<FEValuesBase<dim,sdim> > (
781  new FEVALUES (mapping, el.base_element(i), quadrature, flags));
782  }
783  }
784  n_components = el.n_components();
785  }
786 
787 
788  template <int dim, int spacedim>
789  inline const FEValuesBase<dim, spacedim> &
791  {
792  AssertDimension(fevalv.size(), 1);
793  return *fevalv[0];
794  }
795 
796 
797  template <int dim, int spacedim>
798  inline const FEValuesBase<dim, spacedim> &
800  {
801  Assert (i<fevalv.size(), ExcIndexRange(i,0,fevalv.size()));
802  return *fevalv[i];
803  }
804 
805 
806  template <int dim, int spacedim>
807  template <typename number>
808  inline void
810  {
811  for (unsigned int i=0; i<fevalv.size(); ++i)
812  {
813  FEValuesBase<dim, spacedim> &febase = *fevalv[i];
814  if (info.sub_number != deal_II_numbers::invalid_unsigned_int)
815  {
816  // This is a subface
817  FESubfaceValues<dim> &fe = dynamic_cast<FESubfaceValues<dim>&> (febase);
818  fe.reinit(info.cell, info.face_number, info.sub_number);
819  }
820  else if (info.face_number != deal_II_numbers::invalid_unsigned_int)
821  {
822  // This is a face
823  FEFaceValues<dim> &fe = dynamic_cast<FEFaceValues<dim>&> (febase);
824  fe.reinit(info.cell, info.face_number);
825  }
826  else
827  {
828  // This is a cell
829  FEValues<dim,spacedim> &fe = dynamic_cast<FEValues<dim,spacedim>&> (febase);
830  fe.reinit(info.cell);
831  }
832  }
833 
834  const bool split_fevalues = info.block_info != 0;
835  if (!global_data->empty())
836  fill_local_data(info, split_fevalues);
837  }
838 
839 
840 
841 
842 //----------------------------------------------------------------------//
843 
844  template <int dim, int sdim>
845  inline
846  void
848  unsigned int cp,
849  unsigned int bp,
850  unsigned int fp,
851  bool force)
852  {
853  if (force || cell_quadrature.size() == 0)
854  cell_quadrature = QGauss<dim>(cp);
855  if (force || boundary_quadrature.size() == 0)
856  boundary_quadrature = QGauss<dim-1>(bp);
857  if (force || face_quadrature.size() == 0)
858  face_quadrature = QGauss<dim-1>(fp);
859  }
860 
861 
862  template <int dim, int sdim>
863  inline
864  void
866  {
867  add_update_flags(flags, true, true, true, true);
868  }
869 
870 
871  template <int dim, int sdim>
872  inline
873  void
875  {
876  add_update_flags(flags, true, false, false, false);
877  }
878 
879 
880  template <int dim, int sdim>
881  inline
882  void
884  {
885  add_update_flags(flags, false, true, false, false);
886  }
887 
888 
889  template <int dim, int sdim>
890  inline
891  void
893  {
894  add_update_flags(flags, false, false, true, true);
895  }
896 
897 
898  template <int dim, int sdim>
899  inline
900  void
902  const FiniteElement<dim,sdim> &el,
903  const Mapping<dim,sdim> &mapping,
904  const BlockInfo *block_info)
905  {
906  initialize_update_flags();
907  initialize_gauss_quadrature(
908  (cell_flags & update_values) ? (el.tensor_degree()+1) : el.tensor_degree(),
909  (boundary_flags & update_values) ? (el.tensor_degree()+1) : el.tensor_degree(),
910  (face_flags & update_values) ? (el.tensor_degree()+1) : el.tensor_degree(), false);
911 
912  cell.template initialize<FEValues<dim,sdim> >(el, mapping, cell_quadrature,
913  cell_flags, block_info);
914  boundary.template initialize<FEFaceValues<dim,sdim> >(el, mapping, boundary_quadrature,
915  boundary_flags, block_info);
916  face.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
917  face_flags, block_info);
918  subface.template initialize<FESubfaceValues<dim,sdim> >(el, mapping, face_quadrature,
919  face_flags, block_info);
920  neighbor.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
921  neighbor_flags, block_info);
922  }
923 
924 
925  template <int dim, int sdim>
926  template <typename VECTOR>
927  void
929  const FiniteElement<dim,sdim> &el,
930  const Mapping<dim,sdim> &mapping,
931  const NamedData<VECTOR *> &data,
932  const BlockInfo *block_info)
933  {
934  initialize(el, mapping, block_info);
935  std_cxx1x::shared_ptr<VectorData<VECTOR, dim, sdim> > p;
936 
937  p = std_cxx1x::shared_ptr<VectorData<VECTOR, dim, sdim> >(new VectorData<VECTOR, dim, sdim> (cell_selector));
938  p->initialize(data);
939  cell_data = p;
940  cell.initialize_data(p);
941 
942  p = std_cxx1x::shared_ptr<VectorData<VECTOR, dim, sdim> >(new VectorData<VECTOR, dim, sdim> (boundary_selector));
943  p->initialize(data);
944  boundary_data = p;
945  boundary.initialize_data(p);
946 
947  p = std_cxx1x::shared_ptr<VectorData<VECTOR, dim, sdim> >(new VectorData<VECTOR, dim, sdim> (face_selector));
948  p->initialize(data);
949  face_data = p;
950  face.initialize_data(p);
951  subface.initialize_data(p);
952  neighbor.initialize_data(p);
953  }
954 
955 
956  template <int dim, int sdim>
957  template <typename VECTOR>
958  void
960  const FiniteElement<dim,sdim> &el,
961  const Mapping<dim,sdim> &mapping,
962  const NamedData<MGLevelObject<VECTOR>*> &data,
963  const BlockInfo *block_info)
964  {
965  initialize(el, mapping, block_info);
966  std_cxx1x::shared_ptr<MGVectorData<VECTOR, dim, sdim> > p;
967 
968  p = std_cxx1x::shared_ptr<MGVectorData<VECTOR, dim, sdim> >(new MGVectorData<VECTOR, dim, sdim> (cell_selector));
969  p->initialize(data);
970  cell_data = p;
971  cell.initialize_data(p);
972 
973  p = std_cxx1x::shared_ptr<MGVectorData<VECTOR, dim, sdim> >(new MGVectorData<VECTOR, dim, sdim> (boundary_selector));
974  p->initialize(data);
975  boundary_data = p;
976  boundary.initialize_data(p);
977 
978  p = std_cxx1x::shared_ptr<MGVectorData<VECTOR, dim, sdim> >(new MGVectorData<VECTOR, dim, sdim> (face_selector));
979  p->initialize(data);
980  face_data = p;
981  face.initialize_data(p);
982  subface.initialize_data(p);
983  neighbor.initialize_data(p);
984  }
985 
986 
987  template <int dim, int sdim>
988  template <class DOFINFO>
989  void
991  {}
992 
993 
994  template <int dim, int sdim>
995  template <class DOFINFO>
996  void
998  {}
999 
1000 
1001 }
1002 
1003 DEAL_II_NAMESPACE_CLOSE
1004 
1005 #endif
1006 

deal.II
generated on Sat May 25 2013 23:43:35 by doxygen 1.8.3.1.
Hosting by IWR Universität Heidelberg