16 #include <deal.II/grid/tria_boundary_lib.h> 17 #include <deal.II/grid/tria.h> 18 #include <deal.II/grid/tria_iterator.h> 19 #include <deal.II/grid/tria_accessor.h> 20 #include <deal.II/base/tensor.h> 25 DEAL_II_NAMESPACE_OPEN
29 template <
int dim,
int spacedim>
31 const unsigned int axis)
34 direction (get_axis_vector (axis)),
35 point_on_axis (
Point<spacedim>())
39 template <
int dim,
int spacedim>
45 direction (direction / direction.norm()),
46 point_on_axis (point_on_axis)
50 template <
int dim,
int spacedim>
54 Assert (axis < spacedim, ExcIndexRange (axis, 0, spacedim));
57 axis_vector[axis] = 1;
63 template <
int dim,
int spacedim>
83 if (vector_from_axis.
norm() <= 1e-10 * middle.
norm())
101 const unsigned int spacedim = 3;
105 if (vector_from_axis.
norm() <= 1e-10 * middle.
norm())
121 const unsigned int spacedim = 3;
124 if (vector_from_axis.
norm() <= 1e-10 * middle.
norm())
133 template <
int dim,
int spacedim>
138 Assert (
false, ExcImpossibleInDim(dim));
144 template <
int dim,
int spacedim>
147 const typename Triangulation<dim,spacedim>::line_iterator &line,
157 template <
int dim,
int spacedim>
164 const unsigned int n=
points.size();
165 Assert(n>0, ExcInternalError());
171 for (
unsigned int i=0; i<n; ++i)
173 const double x = line_points[i+1][0];
178 if (vector_from_axis.
norm() <= 1e-10 * middle.
norm())
192 const Triangulation<3>::quad_iterator &quad,
199 unsigned int m=
static_cast<unsigned int> (std::sqrt(static_cast<double>(
points.size())));
202 std::vector<Point<3> > lp0(m);
203 std::vector<Point<3> > lp1(m);
208 std::vector<Point<3> > lps(m);
209 for (
unsigned int i=0; i<m; ++i)
213 for (
unsigned int j=0; j<m; ++j)
221 template <
int dim,
int spacedim>
224 const typename Triangulation<dim,spacedim>::quad_iterator &,
227 Assert (
false, ExcImpossibleInDim(dim));
239 Assert (
false, ExcImpossibleInDim(1));
245 template <
int dim,
int spacedim>
251 for (
unsigned int v=0; v<GeometryInfo<dim>::vertices_per_face; ++v)
258 face_vertex_normals[v] = (vector_from_axis / vector_from_axis.
norm());
264 template <
int dim,
int spacedim>
276 const double radius_1,
291 for (
unsigned int i = 0; i < dim; ++i)
292 if ((
x_1 (i) -
x_0 (i)) != 0)
307 const unsigned int n =
points.size ();
310 Assert (n > 0, ExcInternalError ());
314 for (
unsigned int i=0; i<n; ++i)
316 const double x = line_points[i+1][0];
322 const double c = (x_i -
x_0) * axis / (axis*axis);
340 const double c = (middle -
x_0) * axis / (axis*axis);
343 return middle_p +
get_radius (middle_p) * (middle - middle_p) / (middle - middle_p).norm ();
361 const double c = (middle -
x_0) * axis / (axis*axis);
364 return middle_p +
get_radius (middle_p) * (middle - middle_p) / (middle - middle_p).norm ();
374 Assert (
false, ExcImpossibleInDim (dim));
406 unsigned int n =
static_cast<unsigned int> (std::sqrt (static_cast<double> (
points.size ())));
410 std::vector<Point<3> > points_line_0 (n);
411 std::vector<Point<3> > points_line_1 (n);
416 std::vector<Point<3> > points_line_segment (n);
418 for (
unsigned int i = 0; i < n; ++i)
422 points_line_segment);
424 for (
unsigned int j = 0; j < n; ++j)
425 points[i * n + j] = points_line_segment[j];
438 Assert (
false, ExcImpossibleInDim (dim));
450 Assert (
false, ExcImpossibleInDim (1));
463 for (
unsigned int vertex = 0; vertex < GeometryInfo<dim>::vertices_per_face; ++vertex)
467 const double c = (face->vertex (vertex) -
x_0) * axis / (axis*axis);
471 const Tensor<1,dim> axis_to_vertex = face->vertex (vertex) - vertex_p;
473 face_vertex_normals[vertex] = axis_to_vertex / axis_to_vertex.
norm ();
480 template <
int dim,
int spacedim>
486 compute_radius_automatically(false)
491 template <
int dim,
int spacedim>
501 r = (line->vertex(0) -
center).norm();
506 middle *= r / std::sqrt(middle.
square());
518 Assert (
false, ExcInternalError());
528 Assert (
false, ExcInternalError());
534 template <
int dim,
int spacedim>
545 r = (quad->vertex(0) -
center).norm();
550 middle *= r / std::sqrt(middle.
square());
561 const Triangulation<1>::line_iterator &,
564 Assert (
false, ExcImpossibleInDim(1));
569 template <
int dim,
int spacedim>
572 const typename Triangulation<dim,spacedim>::line_iterator &line,
583 template <
int dim,
int spacedim>
589 const unsigned int n=
points.size();
590 Assert(n>0, ExcInternalError());
594 const double length=(v1-v0).norm();
604 Assert(std::fabs(v0*v0-r*r)<eps*r*r, ExcInternalError());
605 Assert(std::fabs(v1*v1-r*r)<eps*r*r, ExcInternalError());
607 const double alpha=std::acos((v0*v1)/std::sqrt((v0*v0)*(v1*v1)));
610 const double h=pm.
norm();
615 const unsigned int m=n/2;
616 for (
unsigned int i=0; i<m ; ++i)
618 const double beta = alpha * (line_points[i+1][0]-0.5);
619 const double d = h*std::tan(beta);
630 for (
unsigned int i=0; i<n; ++i)
642 const Triangulation<3>::quad_iterator &quad,
649 unsigned int m=
static_cast<unsigned int> (std::sqrt(static_cast<double>(
points.size())));
652 std::vector<Point<3> > lp0(m);
653 std::vector<Point<3> > lp1(m);
658 std::vector<Point<3> > lps(m);
659 for (
unsigned int i=0; i<m; ++i)
663 for (
unsigned int j=0; j<m; ++j)
674 const Triangulation<2,3>::quad_iterator &quad,
681 unsigned int m=
static_cast<unsigned int> (std::sqrt(static_cast<double>(
points.size())));
684 std::vector<Point<3> > lp0(m);
685 std::vector<Point<3> > lp1(m);
690 std::vector<Point<3> > lps(m);
691 for (
unsigned int i=0; i<m; ++i)
695 for (
unsigned int j=0; j<m; ++j)
703 template <
int dim,
int spacedim>
706 const typename Triangulation<dim,spacedim>::quad_iterator &,
709 Assert(
false, ExcImpossibleInDim(dim));
714 template <
int dim,
int spacedim>
721 return unnormalized_normal/unnormalized_normal.
norm();
732 Assert (
false, ExcImpossibleInDim(1));
741 Assert (
false, ExcImpossibleInDim(1));
746 template <
int dim,
int spacedim>
752 for (
unsigned int vertex=0; vertex<GeometryInfo<dim>::vertices_per_face; ++vertex)
753 face_vertex_normals[vertex] = face->vertex(vertex)-
center;
758 template <
int dim,
int spacedim>
767 template <
int dim,
int spacedim>
795 const Point<dim> line_center = line->center();
796 const Point<dim> vertices[2] = { line->vertex(0), line->vertex(1) };
798 if ((line_center(0) == this->
center(0))
800 ((std::fabs(vertices[0].distance(this->
center)-this->
radius) >
803 (std::fabs(vertices[1].distance(this->
center)-this->
radius) >
817 Assert (
false, ExcInternalError());
828 const Point<dim> quad_center = quad->center();
829 if (quad_center(0) == this->
center(0))
845 const Point<dim> line_center = line->center();
846 if (line_center(0) == this->
center(0))
866 const Point<dim> quad_center = quad->center();
867 if (quad_center(0) == this->
center(0))
882 Assert (
false, ExcInternalError());
893 Assert (
false, ExcImpossibleInDim(1));
906 const Point<dim> quad_center = face->center();
907 if (quad_center(0) == this->
center(0))
934 const double inner_radius,
935 const double outer_radius)
938 inner_radius (inner_radius),
939 outer_radius (outer_radius)
942 Assert ((inner_radius >= 0) &&
943 (outer_radius > 0) &&
944 (outer_radius > inner_radius),
945 ExcMessage (
"Inner and outer radii must be specified explicitly in 3d."));
961 if ((line->vertex(0)(0) == this->
center(0))
963 (line->vertex(1)(0) == this->
center(0)))
964 return (line->vertex(0) + line->vertex(1))/2;
976 if (((line->vertex(0)(0) == this->
center(0))
978 (line->vertex(1)(0) == this->
center(0)))
980 !(((std::fabs (line->vertex(0).distance (this->
center)
983 (std::fabs (line->vertex(1).distance (this->
center)
986 ((std::fabs (line->vertex(0).distance (this->
center)
987 - outer_radius) < 1e-12 * outer_radius)
989 (std::fabs (line->vertex(1).distance (this->
center)
990 - outer_radius) < 1e-12 * outer_radius))))
991 return (line->vertex(0) + line->vertex(1))/2;
999 Assert (
false, ExcNotImplemented());
1012 Assert (
false, ExcInternalError());
1026 if ((quad->vertex(0)(0) == this->
center(0)) &&
1027 (quad->vertex(1)(0) == this->
center(0)) &&
1028 (quad->vertex(2)(0) == this->
center(0)) &&
1029 (quad->vertex(3)(0) == this->
center(0)))
1031 const Point<dim> quad_center = (quad->vertex(0) + quad->vertex(1) +
1032 quad->vertex(2) + quad->vertex(3) )/4;
1036 if (std::fabs (quad->line(0)->center().distance(this->center) -
1037 quad->line(1)->center().distance(this->center))
1038 < 1e-12 * outer_radius)
1041 const double needed_radius
1042 = quad->line(0)->center().distance(this->center);
1044 return (this->center +
1045 quad_center_offset/quad_center_offset.
norm() * needed_radius);
1047 else if (std::fabs (quad->line(2)->center().distance(this->center) -
1048 quad->line(3)->center().distance(this->center))
1049 < 1e-12 * outer_radius)
1052 const double needed_radius
1053 = quad->line(2)->center().distance(this->center);
1055 return (this->center +
1056 quad_center_offset/quad_center_offset.
norm() * needed_radius);
1059 Assert (
false, ExcInternalError());
1081 if ((line->vertex(0)(0) == this->
center(0))
1083 (line->vertex(1)(0) == this->
center(0)))
1096 if (((line->vertex(0)(0) == this->
center(0))
1098 (line->vertex(1)(0) == this->
center(0)))
1100 !(((std::fabs (line->vertex(0).distance (this->
center)
1103 (std::fabs (line->vertex(1).distance (this->
center)
1106 ((std::fabs (line->vertex(0).distance (this->
center)
1107 - outer_radius) < 1e-12 * outer_radius)
1109 (std::fabs (line->vertex(1).distance (this->
center)
1110 - outer_radius) < 1e-12 * outer_radius))))
1121 Assert (
false, ExcNotImplemented());
1133 Assert (dim < 3, ExcNotImplemented());
1137 const Point<dim> quad_center = quad->center();
1138 if (quad_center(0) == this->
center(0))
1152 Assert (
false, ExcInternalError());
1163 Assert (
false, ExcImpossibleInDim(1));
1176 if (face->center()(0) == this->
center(0))
1185 template <
int dim,
int spacedim>
1192 Assert (
false, ExcNotImplemented());
1209 template <
int dim,
int spacedim>
1213 const double y)
const 1235 const double theta=surfP(0);
1236 const double phi=surfP(1);
1238 return Point<3> ((
R+r*std::cos(phi))*std::cos(theta),
1240 (
R+r*std::cos(phi))*std::sin(theta));
1249 const double phi=std::asin(std::abs(p(1))/r);
1250 const double Rr_2=p(0)*p(0)+p(2)*p(2);
1255 if (std::abs(p(0))<1.E-5)
1264 const double theta = std::atan(std::abs(p(2)/p(0)));
1286 for (
unsigned int i=0; i<2; i++)
1306 for (
unsigned int i=0; i<4; i++)
1314 for (
unsigned int i=0; i<2; i++)
1315 for (
unsigned int j=1; j<4; j++)
1323 for (
unsigned int i=0; i<4; i++)
1340 double theta=surfP[0];
1341 double phi=surfP[1];
1343 double f=
R+r*std::cos(phi);
1345 n[0]=r*std::cos(phi)*std::cos(theta)*f;
1346 n[1]=r*std::sin(phi)*f;
1347 n[2]=r*std::sin(theta)*std::cos(phi)*f;
1374 unsigned int npoints=
points.size();
1375 if (npoints==0)
return;
1379 for (
unsigned int i=0; i<2; i++)
1382 unsigned int offset[2];
1390 for (
unsigned int i=0; i<2; i++)
1391 for (
unsigned int j=1; j<2; j++)
1400 for (
unsigned int i=0; i<2; i++)
1401 for (
unsigned int j=0; j<2; j++)
1402 if (p[j](i)<1.E-12 )
1408 for (
unsigned int i=0; i<npoints; i++)
1410 const double x = line_points[i+1][0];
1411 target= (1-x)*p[0] + x*p[1];
1425 const unsigned int n=
points.size(),
1426 m=
static_cast<unsigned int>(std::sqrt(static_cast<double>(n)));
1428 Assert(m*m==n, ExcInternalError());
1432 for (
unsigned int i=0; i<4; i++)
1436 unsigned int offset[2];
1444 for (
unsigned int i=0; i<2; i++)
1445 for (
unsigned int j=1; j<4; j++)
1454 for (
unsigned int i=0; i<2; i++)
1455 for (
unsigned int j=0; j<4; j++)
1456 if (p[j](i)<1.E-12 )
1460 for (
unsigned int i=0; i<m; ++i)
1462 const double y=line_points[i+1][0];
1463 for (
unsigned int j=0; j<m; ++j)
1465 const double x=line_points[j+1][0];
1466 target=((1-x) * p[0] +
1484 for (
unsigned int i=0; i<GeometryInfo<2>::vertices_per_face; i++)
1491 #include "tria_boundary_lib.inst" 1493 DEAL_II_NAMESPACE_CLOSE
const std::vector< Point< 1 > > & get_line_support_points(const unsigned int n_intermediate_points) const
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
void get_intermediate_points_between_points(const Point< spacedim > &p0, const Point< spacedim > &p1, std::vector< Point< spacedim > > &points) const
void get_intermediate_points_between_points(const Point< dim > &p0, const Point< dim > &p1, std::vector< Point< dim > > &points) const
virtual Point< dim > get_new_point_on_line(const typename Triangulation< dim >::line_iterator &line) const
virtual void get_normals_at_vertices(const typename Triangulation< dim >::face_iterator &face, typename Boundary< dim >::FaceVertexNormals &face_vertex_normals) const
::ExceptionBase & ExcMessage(std::string arg1)
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
const Point< spacedim > point_on_axis
const Point< spacedim > direction
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual Point< dim > get_new_point_on_quad(const typename Triangulation< dim >::quad_iterator &quad) const
numbers::NumberTraits< Number >::real_type norm() const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim >::line_iterator &line, std::vector< Point< dim > > &points) const
bool compute_radius_automatically
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Boundary< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const
double get_radius(const Point< dim > x) const
Point< dim > get_surf_coord(const Point< spacedim > &p) const
double get_correct_angle(const double angle, const double x, const double y) const
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual Point< dim > get_new_point_on_line(const typename Triangulation< dim >::line_iterator &line) const
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
virtual Point< dim > get_new_point_on_line(const typename Triangulation< dim >::line_iterator &line) const
static Point< spacedim > get_axis_vector(const unsigned int axis)
HalfHyperShellBoundary(const Point< dim > ¢er=Point< dim >(), const double inner_radius=-1, const double outer_radius=-1)
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
std::vector< std_cxx11::shared_ptr< QGaussLobatto< 1 > > > points
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Boundary< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim >::line_iterator &line, std::vector< Point< dim > > &points) const
virtual Point< dim > get_new_point_on_quad(const typename Triangulation< dim >::quad_iterator &quad) const
HalfHyperBallBoundary(const Point< dim > p=Point< dim >(), const double radius=1.0)
#define Assert(cond, exc)
Point< spacedim > get_surf_norm(const Point< spacedim > &p) const
Point< spacedim > get_real_coord(const Point< dim > &surfP) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
ConeBoundary(const double radius_0, const double radius_1, const Point< dim > x_0, const Point< dim > x_1)
const Point< spacedim > center
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim >::quad_iterator &quad, std::vector< Point< dim > > &points) const
virtual Point< dim > get_new_point_on_quad(const typename Triangulation< dim >::quad_iterator &quad) const
virtual void get_normals_at_vertices(const typename Triangulation< dim >::face_iterator &face, typename Boundary< dim >::FaceVertexNormals &face_vertex_normals) const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim >::line_iterator &line, std::vector< Point< dim > > &points) const
double get_radius() const
HyperShellBoundary(const Point< dim > ¢er=Point< dim >())
Point< spacedim > get_surf_norm_from_sp(const Point< dim > &surfP) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
numbers::NumberTraits< Number >::real_type square() const
double get_radius() const
void get_intermediate_points_between_points(const Point< spacedim > &p0, const Point< spacedim > &p1, std::vector< Point< spacedim > > &points) const
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Boundary< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
TorusBoundary(const double R, const double r)
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim >::quad_iterator &quad, std::vector< Point< dim > > &points) const
const double inner_radius
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim >::quad_iterator &quad, std::vector< Point< dim > > &points) const
HyperBallBoundary(const Point< spacedim > p=Point< spacedim >(), const double radius=1.0)
CylinderBoundary(const double radius=1.0, const unsigned int axis=0)
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Boundary< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const
Point< spacedim > get_center() const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual void get_normals_at_vertices(const typename Triangulation< dim >::face_iterator &face, typename Boundary< dim >::FaceVertexNormals &face_vertex_normals) const