include/deal.II/grid/tria_boundary_lib.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: tria_boundary_lib.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
00010 //
00011 //---------------------------------------------------------------------------
00012 #ifndef __deal2__tria_boundary_lib_h
00013 #define __deal2__tria_boundary_lib_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/grid/tria_boundary.h>
00018 
00019 DEAL_II_NAMESPACE_OPEN
00020 
00044 template <int dim, int spacedim = dim>
00045 class CylinderBoundary : public StraightBoundary<dim,spacedim>
00046 {
00047   public:
00057     CylinderBoundary (const double radius = 1.0,
00058                       const unsigned int axis = 0);
00059 
00072     CylinderBoundary (const double       radius,
00073                       const Point<spacedim>   direction,
00074                       const Point<spacedim>   point_on_axis);
00075 
00081     virtual Point<spacedim>
00082     get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
00083 
00089     virtual Point<spacedim>
00090     get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
00091 
00101     virtual void
00102     get_intermediate_points_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line,
00103                                      std::vector<Point<spacedim> > &points) const;
00104 
00114     virtual void
00115     get_intermediate_points_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad,
00116                                      std::vector<Point<spacedim> > &points) const;
00117 
00128     virtual void
00129     get_normals_at_vertices (const typename Triangulation<dim,spacedim>::face_iterator &face,
00130                              typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const;
00131 
00135     double get_radius () const;
00136 
00143     DeclException0 (ExcRadiusNotSet);
00144 
00145 
00146   protected:
00150     const double radius;
00151 
00155     const Point<spacedim> direction;
00156 
00160     const Point<spacedim> point_on_axis;
00161 
00162   private:
00163 
00176     void get_intermediate_points_between_points (const Point<spacedim> &p0, const Point<spacedim> &p1,
00177                                                  std::vector<Point<spacedim> > &points) const;
00178 
00184     static Point<spacedim> get_axis_vector (const unsigned int axis);
00185 };
00186 
00187 
00188 
00222 template <int dim>
00223 class ConeBoundary : public StraightBoundary<dim>
00224 {
00225   public:
00239     ConeBoundary (const double radius_0,
00240                   const double radius_1,
00241                   const Point<dim> x_0,
00242                   const Point<dim> x_1);
00243 
00249     double get_radius (const Point<dim> x) const;
00250 
00257     virtual
00258     Point<dim>
00259     get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
00260 
00267     virtual
00268     Point<dim>
00269     get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
00270 
00280     virtual
00281     void
00282     get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
00283                                      std::vector<Point<dim> > &points) const;
00284 
00295     virtual
00296     void
00297     get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
00298                                      std::vector<Point<dim> > &points) const;
00299 
00310     virtual
00311     void
00312     get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
00313                              typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
00314 
00315   protected:
00320     const double radius_0;
00321 
00326     const double radius_1;
00327 
00331     const Point<dim> x_0;
00332 
00336     const Point<dim> x_1;
00337 
00338   private:
00351     void
00352     get_intermediate_points_between_points (const Point<dim> &p0,
00353                                             const Point<dim> &p1,
00354                                             std::vector<Point<dim> > &points) const;
00355 };
00356 
00357 
00358 
00376 template <int dim, int spacedim=dim>
00377 class HyperBallBoundary : public StraightBoundary<dim,spacedim>
00378 {
00379   public:
00383     HyperBallBoundary (const Point<spacedim> p      = Point<spacedim>(),
00384                        const double     radius = 1.0);
00385 
00391     virtual
00392     Point<spacedim>
00393     get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
00394 
00400     virtual
00401     Point<spacedim>
00402     get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
00403 
00413     virtual
00414     void
00415     get_intermediate_points_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line,
00416                                      std::vector<Point<spacedim> > &points) const;
00417 
00427     virtual
00428     void
00429     get_intermediate_points_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad,
00430                                      std::vector<Point<spacedim> > &points) const;
00431 
00441     virtual
00442     Tensor<1,spacedim>
00443     normal_vector (const typename Triangulation<dim,spacedim>::face_iterator &face,
00444                    const Point<spacedim> &p) const;
00445 
00456     virtual
00457     void
00458     get_normals_at_vertices (const typename Triangulation<dim,spacedim>::face_iterator &face,
00459                              typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const;
00460 
00464     Point<spacedim>
00465     get_center () const;
00466 
00470     double
00471     get_radius () const;
00472 
00479     DeclException0 (ExcRadiusNotSet);
00480 
00481 
00482   protected:
00483 
00487     const Point<spacedim> center;
00488 
00492     const double radius;
00493 
00511     bool compute_radius_automatically;
00512 
00513   private:
00514 
00527     void get_intermediate_points_between_points (const Point<spacedim> &p0, const Point<spacedim> &p1,
00528                                                  std::vector<Point<spacedim> > &points) const;
00529 };
00530 
00531 
00532 
00545 template <int dim>
00546 class HalfHyperBallBoundary : public HyperBallBoundary<dim>
00547 {
00548   public:
00552     HalfHyperBallBoundary (const Point<dim> p      = Point<dim>(),
00553                            const double     radius = 1.0);
00554 
00560     virtual Point<dim>
00561     get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
00562 
00568     virtual Point<dim>
00569     get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
00570 
00580     virtual void
00581     get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
00582                                      std::vector<Point<dim> > &points) const;
00583 
00593     virtual void
00594     get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
00595                                      std::vector<Point<dim> > &points) const;
00596 
00607     virtual void
00608     get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
00609                              typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
00610 };
00611 
00612 
00613 
00624 template <int dim>
00625 class HyperShellBoundary : public HyperBallBoundary<dim>
00626 {
00627   public:
00639     HyperShellBoundary (const Point<dim> &center = Point<dim>());
00640 };
00641 
00642 
00643 
00656 template <int dim>
00657 class HalfHyperShellBoundary : public HyperShellBoundary<dim>
00658 {
00659   public:
00672     HalfHyperShellBoundary (const Point<dim> &center = Point<dim>(),
00673                             const double inner_radius = -1,
00674                             const double outer_radius = -1);
00675 
00679     virtual Point<dim>
00680     get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
00681 
00685     virtual Point<dim>
00686     get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
00687 
00697     virtual void
00698     get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
00699                                      std::vector<Point<dim> > &points) const;
00700 
00710     virtual void
00711     get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
00712                                      std::vector<Point<dim> > &points) const;
00713 
00724     virtual void
00725     get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
00726                              typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
00727 
00728   private:
00732     const double inner_radius;
00733     const double outer_radius;
00734 };
00735 
00736 
00745 template <int dim, int spacedim>
00746 class TorusBoundary : public Boundary<dim,spacedim>
00747 {
00748   public:
00753     TorusBoundary (const double R, const double r);
00754 
00755 //Boundary Refinenment  Functions
00759     virtual Point<spacedim>
00760     get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
00761 
00765     virtual Point<spacedim>
00766     get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
00767 
00771     virtual void   get_intermediate_points_on_line (
00772       const typename Triangulation< dim, spacedim >::line_iterator &  line,
00773       std::vector< Point< spacedim > > &        points) const ;
00774 
00778     virtual void  get_intermediate_points_on_quad (
00779       const typename Triangulation< dim, spacedim >::quad_iterator & quad,
00780       std::vector< Point< spacedim > > &        points ) const ;
00781 
00787     virtual void get_normals_at_vertices (
00788       const typename Triangulation< dim, spacedim >::face_iterator &face,
00789       typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const ;
00790 
00791   private:
00792                                      //Handy functions
00802     double           get_correct_angle(const double angle,const double x,const double y) const;
00803 
00809     Point<spacedim>  get_real_coord(const Point<dim>& surfP) const ;
00810 
00816     Point<dim>       get_surf_coord(const Point<spacedim>& p) const ;
00817 
00823     Point<spacedim>  get_surf_norm_from_sp(const Point<dim>& surfP)      const ;
00824 
00830     Point<spacedim>  get_surf_norm(const Point<spacedim>& p) const ;
00831 
00835     const double R;
00836     const double r;
00837 };
00838 
00839 
00840 
00841 /* -------------- declaration of explicit specializations ------------- */
00842 
00843 #ifndef DOXYGEN
00844 
00845 template <>
00846 Point<1>
00847 HyperBallBoundary<1>::
00848 get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
00849 template <>
00850 void
00851 HyperBallBoundary<1>::get_intermediate_points_on_line (
00852   const Triangulation<1>::line_iterator &,
00853   std::vector<Point<1> > &) const;
00854 template <>
00855 void
00856 HyperBallBoundary<3>::get_intermediate_points_on_quad (
00857   const Triangulation<3>::quad_iterator &quad,
00858   std::vector<Point<3> > &points) const;
00859 template <>
00860 void
00861 HyperBallBoundary<1>::
00862 get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
00863                          Boundary<1,1>::FaceVertexNormals &) const;
00864 template <>
00865 Point<1>
00866 HalfHyperBallBoundary<1>::
00867 get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
00868 template <>
00869 void
00870 HalfHyperBallBoundary<1>::
00871 get_intermediate_points_on_quad (const Triangulation<1>::quad_iterator &,
00872                                  std::vector<Point<1> > &) const;
00873 template <>
00874 void
00875 HalfHyperBallBoundary<1>::
00876 get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
00877                          Boundary<1,1>::FaceVertexNormals &) const;
00878 template <>
00879 Point<1>
00880 HalfHyperShellBoundary<1>::
00881 get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
00882 template <>
00883 void
00884 HalfHyperShellBoundary<1>::
00885 get_intermediate_points_on_quad (const Triangulation<1>::quad_iterator &,
00886                                  std::vector<Point<1> > &) const;
00887 template <>
00888 void
00889 HalfHyperShellBoundary<1>::
00890 get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
00891                          Boundary<1,1>::FaceVertexNormals &) const;
00892 
00893 
00894 #endif // DOXYGEN
00895 
00896 DEAL_II_NAMESPACE_CLOSE
00897 
00898 #endif
00899 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Wed May 23 2012 12:03:25 by doxygen 1.7.3