#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
* @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:
/**
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);
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);
};
* @author Markus Bü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,
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:
/**
* 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;
};
* 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:
/**
*/
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.
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;
};
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;
};
* @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> ¢er = 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;
};
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.
* <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:
/**
*/
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.
*/
/* -------------- 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