16 #include <deal.II/base/tensor.h> 17 #include <deal.II/grid/tria_boundary.h> 18 #include <deal.II/grid/tria.h> 19 #include <deal.II/grid/tria_iterator.h> 20 #include <deal.II/grid/tria_accessor.h> 21 #include <deal.II/fe/fe_q.h> 24 DEAL_II_NAMESPACE_OPEN
31 template <
int dim,
int spacedim>
36 template <
int dim,
int spacedim>
42 Assert (
false, ExcPureFunctionCalled());
47 template <
int dim,
int spacedim>
53 Assert (
false, ExcPureFunctionCalled());
57 template <
int dim,
int spacedim>
63 Assert (dim>1, ExcImpossibleInDim(dim));
68 get_intermediate_points_on_line (face, points);
71 get_intermediate_points_on_quad (face, points);
74 Assert (
false, ExcNotImplemented());
85 Assert (
false, ExcImpossibleInDim(1));
95 Assert (
false, ExcImpossibleInDim(1));
105 Assert (
false, ExcImpossibleInDim(1));
111 template <
int dim,
int spacedim>
117 Assert (
false, ExcPureFunctionCalled());
123 template <
int dim,
int spacedim>
127 FaceVertexNormals &)
const 129 Assert (
false, ExcPureFunctionCalled());
134 template <
int dim,
int spacedim>
144 Assert (
false, ExcPureFunctionCalled());
151 template <
int dim,
int spacedim>
161 Assert (
false, ExcPureFunctionCalled());
168 template <
int dim,
int spacedim>
178 Assert (
false, ExcPureFunctionCalled());
185 template <
int dim,
int spacedim>
186 const std::vector<Point<1> > &
190 if (points.size() <= n_intermediate_points ||
191 points[n_intermediate_points].get() == 0)
194 if (points.size() <= n_intermediate_points)
195 points.resize(n_intermediate_points+1);
198 if (points[n_intermediate_points].
get() == 0)
200 std_cxx11::shared_ptr<QGaussLobatto<1> >
202 points[n_intermediate_points] = quadrature;
205 return points[n_intermediate_points]->get_points();
214 template <
int dim,
int spacedim>
219 template <
int dim,
int spacedim>
224 return (line->vertex(0) + line->vertex(1)) / 2;
235 compute_new_point_on_quad (
const typename Triangulation<dim, 3>::quad_iterator &quad)
290 return (quad->vertex(0) + quad->vertex(1) +
291 quad->vertex(2) + quad->vertex(3) +
292 (quad->line(0)->has_children() ?
293 quad->line(0)->child(0)->vertex(1) :
294 quad->line(0)->center()) +
295 (quad->line(1)->has_children() ?
296 quad->line(1)->child(0)->vertex(1) :
297 quad->line(1)->center()) +
298 (quad->line(2)->has_children() ?
299 quad->line(2)->child(0)->vertex(1) :
300 quad->line(2)->center()) +
301 (quad->line(3)->has_children() ?
302 quad->line(3)->child(0)->vertex(1) :
303 quad->line(3)->center()) ) / 8;
309 template <
int dim,
int spacedim>
323 return compute_new_point_on_quad<2> (quad);
333 return compute_new_point_on_quad<3> (quad);
338 template <
int dim,
int spacedim>
344 const unsigned int n=points.size();
345 Assert(n>0, ExcInternalError());
349 const std::vector<Point<1> > &line_points = this->get_line_support_points(n);
355 for (
unsigned int i=0; i<n; ++i)
357 const double x = line_points[1+i][0];
358 points[i] = (1-x)*vertices[0] + x*vertices[1];
365 template <
int dim,
int spacedim>
371 Assert(
false, ExcImpossibleInDim(dim));
380 std::vector<
Point<3> > &points)
const 382 const unsigned int spacedim = 3;
384 const unsigned int n=points.size(),
385 m=
static_cast<unsigned int>(std::sqrt(static_cast<double>(n)));
387 Assert(m*m==n, ExcInternalError());
389 const std::vector<Point<1> > &line_points = this->get_line_support_points(m);
397 for (
unsigned int i=0; i<m; ++i)
399 const double y=line_points[1+i][0];
400 for (
unsigned int j=0; j<m; ++j)
402 const double x=line_points[1+j][0];
403 points[i*m+j]=((1-x) * vertices[0] +
404 x * vertices[1]) * (1-y) +
405 ((1-x) * vertices[2] +
406 x * vertices[3]) * y;
417 std::vector<
Point<3> > &points)
const 419 const unsigned int spacedim = 3;
421 const unsigned int n=points.size(),
422 m=
static_cast<unsigned int>(std::sqrt(static_cast<double>(n)));
424 Assert(m*m==n, ExcInternalError());
426 const std::vector<Point<1> > &line_points = this->get_line_support_points(m);
434 for (
unsigned int i=0; i<m; ++i)
436 const double y=line_points[1+i][0];
437 for (
unsigned int j=0; j<m; ++j)
439 const double x=line_points[1+j][0];
440 points[i*m+j]=((1-x) * vertices[0] +
441 x * vertices[1]) * (1-y) +
442 ((1-x) * vertices[2] +
443 x * vertices[3]) * y;
456 Assert (
false, ExcNotImplemented());
467 Assert (
false, ExcNotImplemented());
478 Assert (
false, ExcNotImplemented());
492 normalized_alternating_product (
const Tensor<1,2> (&basis_vectors)[1])
494 Tensor<1,2> tmp = cross_product_2d (basis_vectors[0]);
495 return tmp/tmp.
norm();
501 normalized_alternating_product (
const Tensor<1,3> ( &)[1])
506 Assert (
false, ExcNotImplemented());
513 normalized_alternating_product (
const Tensor<1,3> (&basis_vectors)[2])
515 Tensor<1,3> tmp = cross_product_3d (basis_vectors[0], basis_vectors[1]);
516 return tmp/tmp.
norm();
523 template <
int dim,
int spacedim>
534 Assert (dim == spacedim, ExcNotImplemented());
559 const unsigned int facedim = dim-1;
562 for (
unsigned int i=0; i<facedim; ++i)
567 const double eps = 1e-12;
569 unsigned int iteration = 0;
573 for (
unsigned int v=0; v<GeometryInfo<facedim>::vertices_per_cell; ++v)
574 F += face->vertex(v) * linear_fe.
shape_value(v, xi);
576 for (
unsigned int i=0; i<facedim; ++i)
579 for (
unsigned int v=0; v<GeometryInfo<facedim>::vertices_per_cell; ++v)
580 grad_F[i] += face->vertex(v) * linear_fe.
shape_grad(v, xi)[i];
584 for (
unsigned int i=0; i<facedim; ++i)
585 for (
unsigned int j=0; j<spacedim; ++j)
586 J[i] += grad_F[i][j] * (F-p)[j];
589 for (
unsigned int i=0; i<facedim; ++i)
590 for (
unsigned int j=0; j<facedim; ++j)
591 for (
unsigned int k=0; k<spacedim; ++k)
592 H[i][j] += grad_F[i][k] * grad_F[j][k];
599 ExcMessage(
"The Newton iteration to find the reference point " 600 "did not converge in 10 iterations. Do you have a " 601 "deformed cell? (See the glossary for a definition " 602 "of what a deformed cell is. You may want to output " 603 "the vertices of your cell."));
605 if (delta_xi.
norm() < eps)
613 return internal::normalized_alternating_product(grad_F);
624 Assert (
false, ExcImpossibleInDim(1));
633 Assert (
false, ExcNotImplemented());
643 Assert (
false, ExcNotImplemented());
654 const Tensor<1,2> tangent = face->vertex(1) - face->vertex(0);
655 for (
unsigned int vertex=0; vertex<GeometryInfo<2>::vertices_per_face; ++vertex)
657 face_vertex_normals[vertex] =
Point<2>(tangent[1],
667 const Tensor<1,3> tangent = face->vertex(1) - face->vertex(0);
668 for (
unsigned int vertex=0; vertex<GeometryInfo<2>::vertices_per_face; ++vertex)
670 face_vertex_normals[vertex] =
Point<3>(tangent[1],
672 Assert(
false, ExcNotImplemented());
686 static const unsigned int neighboring_vertices[4][2]=
687 { {1,2},{3,0},{0,3},{2,1}};
688 for (
unsigned int vertex=0; vertex<vertices_per_face; ++vertex)
693 = { face->vertex(neighboring_vertices[vertex][0])
694 - face->vertex(vertex),
695 face->vertex(neighboring_vertices[vertex][1])
696 - face->vertex(vertex)
701 face_vertex_normals[vertex] = cross_product_3d(tangents[0], tangents[1]);
707 template <
int dim,
int spacedim>
724 p2 = line->vertex(1);
725 const double s = (trial_point-p1)*(p2-p1) / ((p2-p1)*(p2-p1));
726 return p1 + s*(p2-p1);
734 template <
typename Iterator,
int spacedim,
int dim>
736 compute_projection (
const Iterator &
object,
788 for (
unsigned int d=0; d<dim; ++d)
792 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
793 x_k += object->vertex(i) *
799 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
800 F_k += (x_k-y)*
object->vertex(i) *
804 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
805 for (
unsigned int j=0; j<GeometryInfo<dim>::vertices_per_cell; ++j)
810 H_k += (
object->vertex(i) *
object->vertex(j)) * tmp;
817 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
818 x_k += object->vertex(i) *
821 if (delta_xi.
norm() < 1e-5)
831 template <
typename Iterator>
833 compute_projection (
const Iterator &,
841 template <
typename Iterator>
843 compute_projection (
const Iterator &,
865 template <
int dim,
int spacedim>
874 return internal::compute_projection (quad, y,
880 template <
int dim,
int spacedim>
896 Assert (
false, ExcNotImplemented());
904 #include "tria_boundary.inst" 906 DEAL_II_NAMESPACE_CLOSE
const std::vector< Point< 1 > > & get_line_support_points(const unsigned int n_intermediate_points) const
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const
::ExceptionBase & ExcMessage(std::string arg1)
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
numbers::NumberTraits< Number >::real_type norm() const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
virtual void get_intermediate_points_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line, std::vector< Point< spacedim > > &points) const
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const
virtual Point< spacedim > project_to_surface(const typename Triangulation< dim, spacedim >::line_iterator &line, const Point< spacedim > &candidate) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
#define Assert(cond, exc)
void get_intermediate_points_on_face(const typename Triangulation< dim, spacedim >::face_iterator &face, std::vector< Point< spacedim > > &points) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, FaceVertexNormals &face_vertex_normals) const
virtual Point< spacedim > get_new_point_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad) const
virtual void get_intermediate_points_on_quad(const typename Triangulation< dim, spacedim >::quad_iterator &quad, std::vector< Point< spacedim > > &points) const
virtual Point< spacedim > project_to_surface(const typename Triangulation< dim, spacedim >::line_iterator &line, const Point< spacedim > &candidate) const
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Boundary< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const
static Tensor< 1, dim > d_linear_shape_function_gradient(const Point< dim > &xi, const unsigned int i)
static double d_linear_shape_function(const Point< dim > &xi, const unsigned int i)