]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Compiling intermediate branch manifold id
authorLuca Heltai <luca.heltai@sissa.it>
Mon, 10 Feb 2014 15:28:44 +0000 (15:28 +0000)
committerLuca Heltai <luca.heltai@sissa.it>
Mon, 10 Feb 2014 15:28:44 +0000 (15:28 +0000)
git-svn-id: https://svn.dealii.org/branches/branch_manifold_id_intermediate@32447 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/include/deal.II/grid/tria_accessor.templates.h
deal.II/include/deal.II/grid/tria_boundary_lib.h
deal.II/include/deal.II/numerics/vector_tools.templates.h
deal.II/source/grid/grid_tools.cc
deal.II/source/grid/tria.cc
deal.II/source/grid/tria_accessor.cc

index 7e9cffa7e3906e2f3f993b1d808fe2e2e5c7d163..6dcb43c05237fe27e3287e5699aa35267b996da8 100644 (file)
@@ -1936,7 +1936,7 @@ TriaAccessor<structdim, dim, spacedim>::at_boundary () const
 
 
 template <int structdim, int dim, int spacedim>
-const Manifold<spacedim> &
+const Boundary<dim,spacedim> &
 TriaAccessor<structdim, dim, spacedim>::get_boundary () const
 {
   return get_manifold();
@@ -1944,7 +1944,7 @@ TriaAccessor<structdim, dim, spacedim>::get_boundary () const
 
 
 template <int structdim, int dim, int spacedim>
-const Manifold<spacedim> &
+const Boundary<dim,spacedim> &
 TriaAccessor<structdim, dim, spacedim>::get_manifold () const
 {                                
   Assert (this->used(), TriaAccessorExceptions::ExcCellNotUsed());
index 8daf006889b8a4e651342e3fd7723a089461f979..2f683b964ed3ac41c39c16db5429d05fc9ee9e06 100644 (file)
@@ -20,8 +20,6 @@
 
 #include <deal.II/base/config.h>
 #include <deal.II/grid/tria_boundary.h>
-#include <deal.II/grid/manifold.h>
-#include <deal.II/grid/manifold_lib.h>
 
 DEAL_II_NAMESPACE_OPEN
 
@@ -50,7 +48,7 @@ DEAL_II_NAMESPACE_OPEN
  * @author Guido Kanschat, 2001, Wolfgang Bangerth, 2007
  */
 template <int dim, int spacedim = dim>
-class CylinderBoundary : public FlatManifold<spacedim>
+class CylinderBoundary : public StraightBoundary<dim,spacedim>
 {
 public:
   /**
@@ -62,41 +60,87 @@ public:
                     const unsigned int axis = 0);
 
   /**
-   * Constructor. If constructed with this constructor, the boundary
-   * described is a cylinder with an axis that points in direction
-   * #direction and goes through the given #point_on_axis. The
-   * direction may be arbitrarily scaled, and the given point may be
-   * any point on the axis.
+   * Constructor. If constructed
+   * with this constructor, the
+   * boundary described is a
+   * cylinder with an axis that
+   * points in direction #direction
+   * and goes through the given
+   * #point_on_axis. The direction
+   * may be arbitrarily scaled, and
+   * the given point may be any
+   * point on the axis.
    */
   CylinderBoundary (const double           radius,
                     const Point<spacedim> &direction,
                     const Point<spacedim> &point_on_axis);
 
   /**
-   * Since this class is derived from FlatManifold, we need to
-   * overload only the project_to_manifold function in order for the
-   * boundary to function properly.
+   * Refer to the general documentation of
+   * this class and the documentation of the
+   * base class.
    */
-    virtual Point<spacedim>
-    project_to_manifold (const std::vector<Point<spacedim> > & vertices, 
-                        const Point<spacedim> &candidate) const;
-
+  virtual Point<spacedim>
+  get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
 
   /**
-   * Compute the normal to the surface. 
+   * Refer to the general documentation of
+   * this class and the documentation of the
+   * base class.
    */
   virtual Point<spacedim>
-  normal_vector (const std::vector<Point<spacedim> > & vertices, 
-                const Point<spacedim> &point) const;
-  
+  get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Calls
+   * @p get_intermediate_points_between_points.
+   */
+  virtual void
+  get_intermediate_points_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line,
+                                   std::vector<Point<spacedim> > &points) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Only implemented for <tt>dim=3</tt>
+   * and for <tt>points.size()==1</tt>.
+   */
+  virtual void
+  get_intermediate_points_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad,
+                                   std::vector<Point<spacedim> > &points) const;
+
+  /**
+   * Compute the normals to the
+   * boundary at the vertices of
+   * the given face.
+   *
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual void
+  get_normals_at_vertices (const typename Triangulation<dim,spacedim>::face_iterator &face,
+                           typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const;
+
   /**
    * Return the radius of the cylinder.
    */
   double get_radius () const;
 
   /**
-   * Exception. Thrown by the @p get_radius if the @p
-   * compute_radius_automatically, see below, flag is set true.
+   * Exception. Thrown by the
+   * @p get_radius if the
+   * @p compute_radius_automatically,
+   * see below, flag is set true.
    */
   DeclException0 (ExcRadiusNotSet);
 
@@ -120,8 +164,24 @@ protected:
 private:
 
   /**
-   * Given a number for the axis, return a vector that denotes this
-   * direction.
+   * Called by
+   * @p get_intermediate_points_on_line
+   * and by
+   * @p get_intermediate_points_on_quad.
+   *
+   * Refer to the general
+   * documentation of
+   * @p get_intermediate_points_on_line
+   * in the documentation of the
+   * base class.
+   */
+  void get_intermediate_points_between_points (const Point<spacedim> &p0, const Point<spacedim> &p1,
+                                               std::vector<Point<spacedim> > &points) const;
+
+  /**
+   * Given a number for the axis,
+   * return a vector that denotes
+   * this direction.
    */
   static Point<spacedim> get_axis_vector (const unsigned int axis);
 };
@@ -162,15 +222,21 @@ private:
  * @author Markus B&uuml;rg, 2009
  */
 template <int dim>
-class ConeBoundary : public FlatManifold<dim>
+class ConeBoundary : public StraightBoundary<dim>
 {
 public:
   /**
-   * Constructor. Here the boundary object is constructed. The points
-   * <tt>x_0</tt> and <tt>x_1</tt> describe the starting and ending
-   * points of the axis of the (truncated) cone. <tt>radius_0</tt>
-   * denotes the radius corresponding to <tt>x_0</tt> and
-   * <tt>radius_1</tt> the one corresponding to <tt>x_1</tt>.
+   * Constructor. Here the boundary
+   * object is constructed. The
+   * points <tt>x_0</tt> and
+   * <tt>x_1</tt> describe the
+   * starting and ending points of
+   * the axis of the (truncated)
+   * cone. <tt>radius_0</tt>
+   * denotes the radius
+   * corresponding to <tt>x_0</tt>
+   * and <tt>radius_1</tt> the one
+   * corresponding to <tt>x_1</tt>.
    */
   ConeBoundary (const double radius_0,
                 const double radius_1,
@@ -178,31 +244,75 @@ public:
                 const Point<dim> x_1);
 
   /**
-   * Return the radius of the (truncated) cone at given point
+   * Return the radius of the
+   * (truncated) cone at given point
    * <tt>x</tt> on the axis.
    */
   double get_radius (const Point<dim> x) const;
-    
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual
+  Point<dim>
+  get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual
+  Point<dim>
+  get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
+
   /**
-   * Since this class is derived from FlatManifold, we need to
-   * overload only the project_to_manifold function in order for the
-   * boundary to function properly.
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Calls @p
+   * get_intermediate_points_between_points.
    */
-    virtual Point<dim>
-    project_to_manifold (const std::vector<Point<dim> > & vertices, 
-                        const Point<dim> &candidate) const;
+  virtual
+  void
+  get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
+                                   std::vector<Point<dim> > &points) const;
 
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Only implemented for
+   * <tt>dim=3</tt> and for
+   * <tt>points.size()==1</tt>.
+   */
+  virtual
+  void
+  get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
+                                   std::vector<Point<dim> > &points) const;
 
   /**
-   * Compute the normals to the boundary at the given point
+   * Compute the normals to the
+   * boundary at the vertices of
+   * the given face.
    *
-   * Refer to the general documentation of this class and the
-   * documentation of the base class.
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
    */
   virtual
-  Point<dim> 
-  normal_vector (const std::vector<Point<dim> > & vertices, 
-                const Point<dim> &point) const;
+  void
+  get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
+                           typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
 
 protected:
   /**
@@ -226,6 +336,24 @@ protected:
    * Ending point of the axis.
    */
   const Point<dim> x_1;
+
+private:
+  /**
+   * Called by @p
+   * get_intermediate_points_on_line
+   * and by @p
+   * get_intermediate_points_on_quad.
+   *
+   * Refer to the general
+   * documentation of @p
+   * get_intermediate_points_on_line
+   * in the documentation of the
+   * base class.
+   */
+  void
+  get_intermediate_points_between_points (const Point<dim> &p0,
+                                          const Point<dim> &p1,
+                                          std::vector<Point<dim> > &points) const;
 };
 
 
@@ -239,12 +367,16 @@ protected:
  *   The center of the ball and its radius may be given upon construction of
  *   an object of this type. They default to the origin and a radius of 1.0.
  *
+ *   This class is derived from StraightBoundary rather than from
+ *   Boundary, which would seem natural, since this way we can use the
+ *   StraightBoundary::in_between() function.
+ *
  *   @ingroup boundary
  *
- *   @author Wolfgang Bangerth, 1998, Ralf Hartmann, 2001, Luca Heltai, 2013
+ *   @author Wolfgang Bangerth, 1998, Ralf Hartmann, 2001
  */
 template <int dim, int spacedim=dim>
-class HyperBallBoundary : public FlatManifold<spacedim>
+class HyperBallBoundary : public StraightBoundary<dim,spacedim>
 {
 public:
   /**
@@ -252,28 +384,81 @@ public:
    */
   HyperBallBoundary (const Point<spacedim> p      = Point<spacedim>(),
                      const double     radius = 1.0);
-    
+
   /**
    * Refer to the general documentation of
    * this class and the documentation of the
    * base class.
    */
-    virtual Point<spacedim>
-    get_new_point(const std::vector<Point<spacedim> > &surrounding_points,
-                 const std::vector<double> &weights) const;
+  virtual
+  Point<spacedim>
+  get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
 
+  /**
+   * Refer to the general documentation of
+   * this class and the documentation of the
+   * base class.
+   */
+  virtual
+  Point<spacedim>
+  get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
 
   /**
-   * Implementation of the function declared in the base class.
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
    *
-   * Refer to the general documentation of this class and the
-   * documentation of the base class.
+   * Calls
+   * @p get_intermediate_points_between_points.
    */
   virtual
-  Point<spacedim>
-  normal_vector (const std::vector<Point<spacedim> > & vertices, 
-                const Point<spacedim> &p) const;
+  void
+  get_intermediate_points_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line,
+                                   std::vector<Point<spacedim> > &points) const;
 
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Only implemented for <tt>dim=3</tt>
+   * and for <tt>points.size()==1</tt>.
+   */
+  virtual
+  void
+  get_intermediate_points_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad,
+                                   std::vector<Point<spacedim> > &points) const;
+
+  /**
+   * Implementation of the function
+   * declared in the base class.
+   *
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual
+  Tensor<1,spacedim>
+  normal_vector (const typename Triangulation<dim,spacedim>::face_iterator &face,
+                 const Point<spacedim> &p) const;
+
+  /**
+   * Compute the normals to the
+   * boundary at the vertices of
+   * the given face.
+   *
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual
+  void
+  get_normals_at_vertices (const typename Triangulation<dim,spacedim>::face_iterator &face,
+                           typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const;
 
   /**
    * Return the center of the ball.
@@ -309,28 +494,40 @@ protected:
   const double radius;
 
   /**
-   * This flag is @p false for this class and for all derived classes
-   * that set the radius by the constructor. For example this flag is
-   * @p false for the HalfHyperBallBoundary class but it is @p true
-   * for the HyperShellBoundary class, for example.  The latter class
-   * doesn't get its radii by the constructor but need to compute the
-   * radii automatically each time one of the virtual functions is
+   * This flag is @p false for
+   * this class and for all derived
+   * classes that set the radius by
+   * the constructor. For example
+   * this flag is @p false for the
+   * HalfHyperBallBoundary
+   * class but it is @p true for
+   * the HyperShellBoundary
+   * class, for example.  The
+   * latter class doesn't get its
+   * radii by the constructor but
+   * need to compute the radii
+   * automatically each time one of
+   * the virtual functions is
    * called.
    */
   bool compute_radius_automatically;
 
-
 private:
 
-  /**                                                                           
-   * Called by @p get_new_point for special cases where surrounding
-   * points are two. Returns the point which is at xi between
-   * p0 and p1, where xi is between 0 and 1. 
+  /**
+   * Called by
+   * @p get_intermediate_points_on_line
+   * and by
+   * @p get_intermediate_points_on_quad.
+   *
+   * Refer to the general
+   * documentation of
+   * @p get_intermediate_points_on_line
+   * in the documentation of the
+   * base class.
    */
-  Point<spacedim> get_intermediate_point (const Point<spacedim> &p0, 
-                                         const Point<spacedim> &p1,
-                                         const double xi) const;
-
+  void get_intermediate_points_between_points (const Point<spacedim> &p0, const Point<spacedim> &p1,
+                                               std::vector<Point<spacedim> > &points) const;
 };
 
 
@@ -357,27 +554,61 @@ public:
   HalfHyperBallBoundary (const Point<dim> p      = Point<dim>(),
                          const double     radius = 1.0);
 
-    
   /**
-   * Refer to the general documentation of this class and the
-   * documentation of the base class.
+   * Check if on the line <tt>x==0</tt>,
+   * otherwise pass to the base
+   * class.
+   */
+  virtual Point<dim>
+  get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
+
+  /**
+   * Check if on the line <tt>x==0</tt>,
+   * otherwise pass to the base
+   * class.
    */
-    virtual
-    Point<dim>
-    get_new_point(const std::vector<Point<dim> > &surrounding_points,
-                 const std::vector<double> &weights) const;
+  virtual Point<dim>
+  get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
 
-    
   /**
-   * Implementation of the function declared in the base class.
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
    *
-   * Refer to the general documentation of this class and the
-   * documentation of the base class.
+   * Calls
+   * @p get_intermediate_points_between_points.
    */
-  virtual
-  Point<dim>
-  normal_vector (const std::vector<Point<dim> > & vertices, 
-                const Point<dim> &p) const;
+  virtual void
+  get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
+                                   std::vector<Point<dim> > &points) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Only implemented for <tt>dim=3</tt>
+   * and for <tt>points.size()==1</tt>.
+   */
+  virtual void
+  get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
+                                   std::vector<Point<dim> > &points) const;
+
+  /**
+   * Compute the normals to the
+   * boundary at the vertices of
+   * the given face.
+   *
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual void
+  get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
+                           typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
 };
 
 
@@ -393,21 +624,21 @@ public:
  * @author Wolfgang Bangerth, 1999
  */
 template <int dim>
-class HyperShellBoundary : public PolarManifold<dim>
+class HyperShellBoundary : public HyperBallBoundary<dim>
 {
 public:
   /**
-   * Constructor. The center of the spheres defaults to the origin.
+   * Constructor. The center of the
+   * spheres defaults to the
+   * origin.
+   *
+   * Calls the constructor of its
+   * base @p HyperBallBoundary
+   * class with a dummy radius as
+   * argument. This radius will be
+   * ignored
    */
   HyperShellBoundary (const Point<dim> &center = Point<dim>());
-  
-  /**
-   * Project to manifold. The vertices are used to compute
-   * automatically the radius.
-   */
-  virtual Point<dim>
-  project_to_manifold(const std::vector<Point<dim> > &vertices, 
-                     const Point<dim> &p) const;
 };
 
 
@@ -444,14 +675,58 @@ public:
                           const double inner_radius = -1,
                           const double outer_radius = -1);
 
+  /**
+   * Construct a new point on a line.
+   */
+  virtual Point<dim>
+  get_new_point_on_line (const typename Triangulation<dim>::line_iterator &line) const;
 
   /**
-   * Compute the normal to the surface. 
+   * Construct a new point on a quad.
    */
-    virtual Point<dim>
-    normal_vector (const std::vector<Point<dim> > & vertices, 
-                  const Point<dim> &point) const;
-    
+  virtual Point<dim>
+  get_new_point_on_quad (const typename Triangulation<dim>::quad_iterator &quad) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Calls
+   * @p get_intermediate_points_between_points.
+   */
+  virtual void
+  get_intermediate_points_on_line (const typename Triangulation<dim>::line_iterator &line,
+                                   std::vector<Point<dim> > &points) const;
+
+  /**
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   *
+   * Only implemented for <tt>dim=3</tt>
+   * and for <tt>points.size()==1</tt>.
+   */
+  virtual void
+  get_intermediate_points_on_quad (const typename Triangulation<dim>::quad_iterator &quad,
+                                   std::vector<Point<dim> > &points) const;
+
+  /**
+   * Compute the normals to the
+   * boundary at the vertices of
+   * the given face.
+   *
+   * Refer to the general
+   * documentation of this class
+   * and the documentation of the
+   * base class.
+   */
+  virtual void
+  get_normals_at_vertices (const typename Triangulation<dim>::face_iterator &face,
+                           typename Boundary<dim>::FaceVertexNormals &face_vertex_normals) const;
+
 private:
   /**
    * Inner and outer radii of the shell.
@@ -470,7 +745,7 @@ private:
  * <tt>dim=2</tt>,<tt>spacedim=3</tt>, that is, just the surface.
  */
 template <int dim, int spacedim>
-class TorusBoundary : public ManifoldChart<dim,spacedim>
+class TorusBoundary : public Boundary<dim,spacedim>
 {
 public:
   /**
@@ -479,43 +754,83 @@ public:
    */
   TorusBoundary (const double R, const double r);
 
+//Boundary Refinenment  Functions
   /**
-   * Pull back the given point in spacedim to the euclidean dim
-   * dimensional space.  Get the surface coordinates of the Torus,
-   * i.e., from <tt>(x,y,z)</tt> to <tt>(theta,phi)</tt>.
-   *
-   * Refer to the general documentation of this class for more
-   * information.
+   * Construct a new point on a line.
+   */
+  virtual Point<spacedim>
+  get_new_point_on_line (const typename Triangulation<dim,spacedim>::line_iterator &line) const;
+
+  /**
+   * Construct a new point on a quad.
+   */
+  virtual Point<spacedim>
+  get_new_point_on_quad (const typename Triangulation<dim,spacedim>::quad_iterator &quad) const;
+
+  /**
+   * Construct a new points on a line.
    */
-    virtual Point<dim>
-    pull_back(const Point<spacedim> &space_point) const;
-    
-    /**
-     * Given a point in the dim dimensianal Euclidean space, this
-     * method returns a point on the manifold embedded in the spacedim
-     * Euclidean space.  Get the cartesian coordinates of the Torus,
-     * i.e., from <tt>(theta,phi)</tt> to <tt>(x,y,z)</tt>.
-     */
-    virtual Point<spacedim>
-    push_forward(const Point<dim> &chart_point) const;
+  virtual void   get_intermediate_points_on_line (
+    const typename Triangulation< dim, spacedim >::line_iterator   &line,
+    std::vector< Point< spacedim > >         &points) const ;
 
   /**
-   * Get the normal from cartesian coordinates. This normal does not
-   * have unit length.
+   * Construct a new points on a quad.
    */
-  Point<spacedim>  normal_vector(const std::vector<Point<spacedim> > & vertices, 
-                                const Point<spacedim> &p) const;
+  virtual void  get_intermediate_points_on_quad (
+    const typename Triangulation< dim, spacedim >::quad_iterator &quad,
+    std::vector< Point< spacedim > >         &points ) const ;
+
+  /**
+   * Get the normal from cartesian
+   * coordinates. This normal does not have
+   * unit length.
+   */
+  virtual void get_normals_at_vertices (
+    const typename Triangulation< dim, spacedim >::face_iterator &face,
+    typename Boundary<dim,spacedim>::FaceVertexNormals &face_vertex_normals) const ;
 
 private:
+  //Handy functions
+  /**
+   * Function that corrects the value and
+   * sign of angle, that is, given
+   * <tt>angle=tan(abs(y/x))</tt>; if <tt>
+   * (y > 0) && (x < 0) </tt> then
+   * <tt>correct_angle = Pi - angle</tt>,
+   * etc.
+   */
+
   double           get_correct_angle(const double angle,const double x,const double y) const;
 
+  /**
+   * Get the cartesian coordinates of the
+   * Torus, i.e., from <tt>(theta,phi)</tt>
+   * to <tt>(x,y,z)</tt>.
+   */
+  Point<spacedim>  get_real_coord(const Point<dim> &surfP) const ;
+
+  /**
+   * Get the surface coordinates of the
+   * Torus, i.e., from <tt>(x,y,z)</tt> to
+   * <tt>(theta,phi)</tt>.
+   */
+  Point<dim>       get_surf_coord(const Point<spacedim> &p) const ;
+
   /**
    * Get the normal from surface
    * coordinates. This normal does not have
    * unit length.
    */
   Point<spacedim>  get_surf_norm_from_sp(const Point<dim> &surfP)      const ;
-    
+
+  /**
+   * Get the normal from cartesian
+   * coordinates. This normal does not have
+   * unit length.
+   */
+  Point<spacedim>  get_surf_norm(const Point<spacedim> &p) const ;
+
   /**
    * Inner and outer radii of the shell.
    */
@@ -527,6 +842,59 @@ private:
 
 /* -------------- declaration of explicit specializations ------------- */
 
+#ifndef DOXYGEN
+
+template <>
+Point<1>
+HyperBallBoundary<1>::
+get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
+template <>
+void
+HyperBallBoundary<1>::get_intermediate_points_on_line (
+  const Triangulation<1>::line_iterator &,
+  std::vector<Point<1> > &) const;
+template <>
+void
+HyperBallBoundary<3>::get_intermediate_points_on_quad (
+  const Triangulation<3>::quad_iterator &quad,
+  std::vector<Point<3> > &points) const;
+template <>
+void
+HyperBallBoundary<1>::
+get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
+                         Boundary<1,1>::FaceVertexNormals &) const;
+template <>
+Point<1>
+HalfHyperBallBoundary<1>::
+get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
+template <>
+void
+HalfHyperBallBoundary<1>::
+get_intermediate_points_on_quad (const Triangulation<1>::quad_iterator &,
+                                 std::vector<Point<1> > &) const;
+template <>
+void
+HalfHyperBallBoundary<1>::
+get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
+                         Boundary<1,1>::FaceVertexNormals &) const;
+template <>
+Point<1>
+HalfHyperShellBoundary<1>::
+get_new_point_on_quad (const Triangulation<1>::quad_iterator &) const;
+template <>
+void
+HalfHyperShellBoundary<1>::
+get_intermediate_points_on_quad (const Triangulation<1>::quad_iterator &,
+                                 std::vector<Point<1> > &) const;
+template <>
+void
+HalfHyperShellBoundary<1>::
+get_normals_at_vertices (const Triangulation<1,1>::face_iterator &,
+                         Boundary<1,1>::FaceVertexNormals &) const;
+
+
+#endif // DOXYGEN
+
 DEAL_II_NAMESPACE_CLOSE
 
 #endif
index abb0ee58f64aeb74ea89a404ada954a342e4e61e..6b57aea315ed8e8fa4d817a6a7956c5c3e1feecf 100644 (file)
@@ -4424,12 +4424,10 @@ namespace VectorTools
                     // sign of the normal vector provided by the boundary
                     // if they should point in different directions. this is the
                     // case in tests/deal.II/no_flux_11.
-                   std::vector<Point<dim> > vertices(GeometryInfo<dim>::vertices_per_face);
-                   for(unsigned int v=0; v<GeometryInfo<dim>::vertices_per_face; ++v)
-                     vertices[v] = cell->face(face_no)->vertex(v);
                     Point<dim> normal_vector
                       = (cell->face(face_no)->get_boundary()
-                         .normal_vector (vertices, fe_values.quadrature_point(i)));
+                         .normal_vector (cell->face(face_no),
+                                         fe_values.quadrature_point(i)));
                     if (normal_vector * fe_values.normal_vector(i) < 0)
                       normal_vector *= -1;
                     Assert (std::fabs(normal_vector.norm() - 1) < 1e-14,
index c03cf1acc740e04eb8d03003cf432796d2d02a34..44cdca00d781c8571d26c6e24480819c18de17e5 100644 (file)
@@ -1744,16 +1744,14 @@ next_cell:
       fix_up_object (const Iterator &object,
                      const bool respect_manifold)
       {
-        const Manifold<Iterator::AccessorType::space_dimension>
+        const Boundary<Iterator::AccessorType::dimension,
+              Iterator::AccessorType::space_dimension>
               *manifold = (respect_manifold ?
                            &object->get_boundary() :
                            0);
 
         const unsigned int structdim = Iterator::AccessorType::structure_dimension;
         const unsigned int spacedim  = Iterator::AccessorType::space_dimension;
-       std::vector<Point<spacedim> > vertices(GeometryInfo<structdim>::vertices_per_cell);
-       for(unsigned int i=0; i<vertices.size(); ++i)
-         vertices[i] = object->vertex(i);
 
         // right now we can only deal
         // with cells that have been
@@ -1817,16 +1815,16 @@ next_cell:
                        /
                        eps);
                 else
-                   gradient[d]
-                     = ((objective_function (object,
-                                             manifold->project_to_manifold(vertices, 
-                                                                          object_mid_point + h))
-                         -
-                         objective_function (object,
-                                             manifold->project_to_manifold(vertices, 
-                                                                          object_mid_point - h)))
-                        /
-                        eps);
+                  gradient[d]
+                    = ((objective_function (object,
+                                            manifold->project_to_surface(object,
+                                                                         object_mid_point + h))
+                        -
+                        objective_function (object,
+                                            manifold->project_to_surface(object,
+                                                                         object_mid_point - h)))
+                       /
+                       eps);
               }
 
             // sometimes, the
@@ -1858,8 +1856,8 @@ next_cell:
                                 gradient;
 
             if (respect_manifold == true)
-              object_mid_point = manifold->project_to_manifold(vertices, 
-                                                              object_mid_point);
+              object_mid_point = manifold->project_to_surface(object,
+                                                              object_mid_point);
 
             // compute current value of the
             // objective function
index be24961e2f1c5f9843d93a688c29d7f1e6376a96..a3701f8c80805be53db75afc4768f849ca4f7bc3 100644 (file)
@@ -9585,23 +9585,13 @@ Triangulation<dim, spacedim>::set_mesh_smoothing(const MeshSmoothing mesh_smooth
 
 template <int dim, int spacedim>
 void
-Triangulation<dim, spacedim>::set_boundary (const types::boundary_id number,
+Triangulation<dim, spacedim>::set_boundary (const types::boundary_id m_number,
                                             const Boundary<dim, spacedim> &boundary_object)
-{
-  set_manifold(m_number, boundary_object);
-}
-
-
-
-template <int dim, int spacedim>
-void
-Triangulation<dim, spacedim>::set_manifold (const types::manifold_id m_number,
-                                            const Boundary<dim,spacedim> &manifold_object)
 {
   Assert(m_number < numbers::invalid_manifold_id,
         ExcIndexRange(m_number,0,numbers::invalid_manifold_id));
 
-  manifold[m_number] = &manifold_object;
+  manifold[m_number] = &boundary_object;
 }
 
 
index d0926960955811fc362490ca9eb6b37cc848f413..c0df81098c37dab75b0d74ee8ac67cfd3622caf5 100644 (file)
@@ -22,7 +22,6 @@
 #include <deal.II/grid/tria_iterator.templates.h>
 #include <deal.II/base/geometry_info.h>
 #include <deal.II/grid/grid_tools.h>
-#include <deal.II/grid/tria_boundary.h>
 #include <deal.II/fe/mapping_q1.h>
 
 #include <cmath>

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.