00001
00002
00003
00004
00005
00006
00007
00008
00009
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> ¢er = Point<dim>());
00640 };
00641
00642
00643
00656 template <int dim>
00657 class HalfHyperShellBoundary : public HyperShellBoundary<dim>
00658 {
00659 public:
00672 HalfHyperShellBoundary (const Point<dim> ¢er = 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
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
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
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