31#include <boost/container/small_vector.hpp>
54 const double theta = dir.norm();
64 return tmp / tmp.norm();
81 template <
int spacedim>
92 Assert(vector.norm_square() != 0.,
93 ExcMessage(
"The direction parameter must not be zero!"));
100 normal[0] = (vector[1] + vector[2]) / vector[0];
107 normal[1] = (vector[0] + vector[2]) / vector[1];
113 normal[2] = (vector[0] + vector[1]) / vector[2];
116 normal /= normal.norm();
127template <
int dim,
int spacedim>
136template <
int dim,
int spacedim>
137std::unique_ptr<Manifold<dim, spacedim>>
140 return std::make_unique<PolarManifold<dim, spacedim>>(*this);
145template <
int dim,
int spacedim>
162template <
int dim,
int spacedim>
168 ExcMessage(
"Negative radius for given point."));
196template <
int dim,
int spacedim>
202 const double rho = R.norm();
211 p[1] = std::atan2(R[1], R[0]);
219 const double z = R[2];
220 p[2] = std::atan2(R[1], R[0]);
223 p[1] = std::atan2(
std::sqrt(R[0] * R[0] + R[1] * R[1]), z);
235template <
int dim,
int spacedim>
241 ExcMessage(
"Negative radius for given point."));
285 template <
int dim,
int spacedim>
297 constexpr unsigned int n_vertices =
303 for (
unsigned int i = 1; i < n_vertices; ++i)
308 (face->vertex(i) - face->vertex(0)).norm_square();
324template <
int dim,
int spacedim>
358template <
int dim,
int spacedim>
367template <
int dim,
int spacedim>
368std::unique_ptr<Manifold<dim, spacedim>>
371 return std::make_unique<SphericalManifold<dim, spacedim>>(*this);
376template <
int dim,
int spacedim>
381 const double w)
const
383 const double tol = 1e-10;
385 if ((
p1 -
p2).norm_square() < tol * tol ||
std::abs(w) < tol)
397 const double r1 =
v1.norm();
398 const double r2 =
v2.norm();
401 ExcMessage(
"p1 and p2 cannot coincide with the center."));
410 if (
cosgamma < -1 + 8. * std::numeric_limits<double>::epsilon())
414 if (
cosgamma > 1 - 8. * std::numeric_limits<double>::epsilon())
425 const double n_norm = n.norm();
428 "Probably, this means v1==v2 or v2==0."));
442template <
int dim,
int spacedim>
448 const double tol = 1e-10;
455 const double r1 =
v1.norm();
456 const double r2 =
v2.norm();
468 Assert(
cosgamma > -1 + 8. * std::numeric_limits<double>::epsilon(),
469 ExcMessage(
"p1 and p2 cannot lie on the same diameter and be opposite "
470 "respect to the center."));
472 if (
cosgamma > 1 - 8. * std::numeric_limits<double>::epsilon())
478 const double n_norm = n.norm();
481 "Probably, this means v1==v2 or v2==0."));
487 const double gamma = std::acos(
cosgamma);
488 return (
r2 -
r1) *
e1 +
r1 * gamma * n;
493template <
int dim,
int spacedim>
545template <
int dim,
int spacedim>
561 for (
unsigned int vertex = 0;
572template <
int dim,
int spacedim>
589template <
int dim,
int spacedim>
607template <
int dim,
int spacedim>
621 for (
unsigned int row = 0; row <
weight_rows; ++row)
629 boost::container::small_vector<std::pair<double, Tensor<1, spacedim>>, 100>
631 boost::container::small_vector<Tensor<1, spacedim>, 100>
directions(
633 boost::container::small_vector<double, 100>
distances(
645 ExcMessage(
"One of the vertices coincides with the center. "
646 "This is not allowed!"));
650 for (
unsigned int k = 0;
k < i; ++
k)
660 const double tolerance = 1e-10;
667 for (
unsigned int row = 0; row <
weight_rows; ++row)
687 new_points[row] = polar_manifold.get_new_point(
704 for (
unsigned int row = 0; row <
weight_rows; ++row)
736 for (
unsigned int row = 0; row <
weight_rows; ++row)
746 for (
unsigned int row = 0; row <
weight_rows; ++row)
758 for (
unsigned int row = 0; row <
weight_rows; ++row)
792 for (
unsigned int row = 0; row <
weight_rows; ++row)
816template <
int dim,
int spacedim>
817std::pair<double, Tensor<1, spacedim>>
823 const double tolerance = 1e-10;
832 if (
std::abs(1 - weights[i]) < tolerance)
853 template <
int spacedim>
878 const double tolerance = 1
e-10;
879 const int max_iterations = 10;
913 for (
unsigned int i = 0; i < max_iterations; ++i)
987template <
int dim,
int spacedim>
1043template <
int dim,
int spacedim>
1045 const double tolerance)
1053 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1058template <
int dim,
int spacedim>
1062 const double tolerance)
1065 , direction(direction / direction.norm())
1066 , point_on_axis(point_on_axis)
1067 , tolerance(tolerance)
1073 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1078template <
int dim,
int spacedim>
1079std::unique_ptr<Manifold<dim, spacedim>>
1082 return std::make_unique<CylindricalManifold<dim, spacedim>>(*this);
1087template <
int dim,
int spacedim>
1094 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1105 const double lambda =
middle * direction;
1108 return point_on_axis + direction * lambda;
1116template <
int dim,
int spacedim>
1122 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1142template <
int dim,
int spacedim>
1148 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1162template <
int dim,
int spacedim>
1168 ExcMessage(
"CylindricalManifold can only be used for spacedim==3!"));
1176 normal_direction * cosine + dxn * sine;
1179 constexpr int s0 = 0 % spacedim;
1180 constexpr int s1 = 1 % spacedim;
1181 constexpr int s2 = 2 % spacedim;
1206template <
int dim,
int spacedim>
1216 , sinh_u(
std::sqrt(cosh_u * cosh_u - 1.0))
1223 "Invalid eccentricity: It must satisfy 0 < eccentricity < 1."));
1227 "Invalid major axis direction vector: Null vector not allowed."));
1233template <
int dim,
int spacedim>
1234std::unique_ptr<Manifold<dim, spacedim>>
1237 return std::make_unique<EllipticalManifold<dim, spacedim>>(*this);
1242template <
int dim,
int spacedim>
1255template <
int dim,
int spacedim>
1276 const Point<2> p(direction[0] *
x - direction[1] *
y,
1277 direction[1] *
x + direction[0] *
y);
1283template <
int dim,
int spacedim>
1300 const double x = direction[0] *
x0 + direction[1] *
y0;
1301 const double y = -direction[1] *
x0 + direction[0] *
y0;
1303 std::sqrt((
x *
x) / (cosh_u * cosh_u) + (
y *
y) / (sinh_u * sinh_u));
1325template <
int dim,
int spacedim>
1344 dX[0][0] = cosh_u *
cs;
1346 dX[1][0] = sinh_u *
sn;
1351 {{+direction[0], -direction[1]}, {direction[1], direction[0]}}};
1361template <
int dim,
int spacedim,
int chartdim>
1366 const double tolerance)
1369 , push_forward_function(&push_forward_function)
1370 , pull_back_function(&pull_back_function)
1371 , tolerance(tolerance)
1372 , owns_pointers(
false)
1373 , finite_difference_step(0)
1381template <
int dim,
int spacedim,
int chartdim>
1386 const double tolerance)
1389 , push_forward_function(push_forward.
release())
1390 , pull_back_function(pull_back.
release())
1391 , tolerance(tolerance)
1392 , owns_pointers(
true)
1393 , finite_difference_step(0)
1401template <
int dim,
int spacedim,
int chartdim>
1403 const std::string push_forward_expression,
1404 const std::string pull_back_expression,
1407 const std::string chart_vars,
1408 const std::string space_vars,
1409 const double tolerance,
1412 , const_map(const_map)
1413 , tolerance(tolerance)
1414 , owns_pointers(
true)
1415 , push_forward_expression(push_forward_expression)
1416 , pull_back_expression(pull_back_expression)
1417 , chart_vars(chart_vars)
1418 , space_vars(space_vars)
1419 , finite_difference_step(h)
1431template <
int dim,
int spacedim,
int chartdim>
1434 if (owns_pointers ==
true)
1437 push_forward_function =
nullptr;
1441 pull_back_function =
nullptr;
1448template <
int dim,
int spacedim,
int chartdim>
1449std::unique_ptr<Manifold<dim, spacedim>>
1464 if (!(push_forward_expression.empty() && pull_back_expression.empty()))
1466 return std::make_unique<FunctionManifold<dim, spacedim, chartdim>>(
1467 push_forward_expression,
1468 pull_back_expression,
1469 this->get_periodicity(),
1474 finite_difference_step);
1478 return std::make_unique<FunctionManifold<dim, spacedim, chartdim>>(
1479 *push_forward_function,
1480 *pull_back_function,
1481 this->get_periodicity(),
1488template <
int dim,
int spacedim,
int chartdim>
1496 for (
unsigned int i = 0; i < spacedim; ++i)
1501 pull_back_function->vector_value(
result,
pb);
1502 for (
unsigned int i = 0; i < chartdim; ++i)
1508 "The push forward is not the inverse of the pull back! Bailing out."));
1516template <
int dim,
int spacedim,
int chartdim>
1522 for (
unsigned int i = 0; i < spacedim; ++i)
1524 const auto gradient = push_forward_function->gradient(
chart_point, i);
1525 for (
unsigned int j = 0;
j < chartdim; ++
j)
1526 DF[i][
j] = gradient[
j];
1533template <
int dim,
int spacedim,
int chartdim>
1541 for (
unsigned int i = 0; i < chartdim; ++i)
1558 double phi = std::atan2(
y,
x);
1562 Utilities::fixed_power<2>(
x -
std::cos(
phi) * R) + z * z) /
1564 return {
phi, theta, w};
1591 ExcMessage(
"Outer radius R must be greater than the inner "
1599std::unique_ptr<Manifold<dim, 3>>
1602 return std::make_unique<TorusManifold<dim>>(R, r);
1622 DX[1][1] = r * w *
std::cos(theta);
1637template <
int dim,
int spacedim>
1648template <
int dim,
int spacedim>
1650 spacedim>::~TransfiniteInterpolationManifold()
1652 if (clear_signal.connected())
1653 clear_signal.disconnect();
1658template <
int dim,
int spacedim>
1659std::unique_ptr<Manifold<dim, spacedim>>
1665 return std::unique_ptr<Manifold<dim, spacedim>>(ptr);
1670template <
int dim,
int spacedim>
1677 clear_signal.disconnect();
1678 clear_signal =
triangulation.signals.clear.connect([&]() ->
void {
1679 this->triangulation =
nullptr;
1680 this->level_coarse = -1;
1683 coarse_cell_is_flat.resize(
triangulation.n_cells(level_coarse),
false);
1684 quadratic_approximation.clear();
1694 std::vector<Point<dim>> unit_points =
1696 std::vector<Point<spacedim>> real_points(unit_points.size());
1698 for (
const auto &cell :
triangulation.active_cell_iterators())
1702 if (cell->line(l)->manifold_id() != cell->manifold_id() &&
1707 if (cell->quad(
q)->manifold_id() != cell->manifold_id() &&
1711 coarse_cell_is_flat.size());
1715 for (
unsigned int i = 0; i < unit_points.size(); ++i)
1716 real_points[i] = push_forward(cell, unit_points[i]);
1717 quadratic_approximation.emplace_back(real_points, unit_points);
1726 template <
typename AccessorType>
1737 template <
typename AccessorType>
1743 const unsigned int dim = AccessorType::dimension;
1744 const unsigned int spacedim = AccessorType::space_dimension;
1752 const std::array<Point<spacedim>, 4>
vertices{
1753 {cell.vertex(0), cell.vertex(1), cell.vertex(2), cell.vertex(3)}};
1779 std::array<double, GeometryInfo<2>::vertices_per_face> weights;
1798 cell.line(line)->manifold_id();
1852 template <
typename AccessorType>
1858 const unsigned int dim = AccessorType::dimension;
1859 const unsigned int spacedim = AccessorType::space_dimension;
1865 const std::array<Point<spacedim>, 8>
vertices{{cell.vertex(0),
1878 for (
unsigned int d = 0;
d < 3; ++
d)
1885 for (
unsigned int d = 6;
d < 10; ++
d)
1889 for (
unsigned int i2 = 0, v = 0;
i2 < 2; ++
i2)
1890 for (
unsigned int i1 = 0;
i1 < 2; ++
i1)
1891 for (
unsigned int i0 = 0;
i0 < 2; ++
i0, ++v)
1897 for (
unsigned int v = 0; v < 8; ++v)
1904 std::array<double, GeometryInfo<3>::lines_per_cell>
weights_lines;
1908 std::array<double, GeometryInfo<2>::vertices_per_cell> weights;
1915 for (
const unsigned int face :
GeometryInfo<3>::face_indices())
1918 const unsigned int face_even = face - face % 2;
1926 cell.face(face)->manifold_id();
1930 for (
unsigned int line = 0;
1989 const unsigned int subline = line - 8;
1999 cell.line(line)->manifold_id();
2034template <
int dim,
int spacedim>
2046 ExcMessage(
"chart_point is not in unit interval"));
2050 coarse_cell_is_flat[cell->index()]);
2055template <
int dim,
int spacedim>
2064 for (
unsigned int d = 0; d < dim; ++d)
2067 const double step =
chart_point[d] > 0.5 ? -1e-8 : 1e-8;
2074 coarse_cell_is_flat[cell->index()]) -
2076 for (
unsigned int e = 0; e < spacedim; ++e)
2077 grad[e][d] = difference[e] / step;
2084template <
int dim,
int spacedim>
2092 for (
unsigned int d = 0; d < dim; ++d)
2108 coarse_cell_is_flat[cell->index()]);
2109 const double tolerance = 1e-21 * Utilities::fixed_power<2>(cell->diameter());
2113 for (
unsigned int i = 0; i < 100; ++i)
2122 for (
unsigned int d = 0; d < spacedim; ++d)
2123 for (
unsigned int e = 0; e < dim; ++e)
2145 push_forward_gradient(cell,
2148 if (
grad.determinant() <= 0.0)
2154 for (
unsigned int d = 0; d < spacedim; ++d)
2155 for (
unsigned int e = 0; e < dim; ++e)
2170 while (
alpha > 1e-4)
2175 *cell,
guess, coarse_cell_is_flat[cell->index()]);
2208 for (
unsigned int d = 0; d < spacedim; ++d)
2209 for (
unsigned int e = 0; e < dim; ++e)
2222 for (
unsigned int d = 0; d < spacedim; ++d)
2223 for (
unsigned int e = 0; e < dim; ++e)
2225 for (
unsigned int d = 0; d < spacedim; ++d)
2226 for (
unsigned int e = 0; e < dim; ++e)
2235template <
int dim,
int spacedim>
2236std::array<unsigned int, 20>
2246 ExcMessage(
"The manifold was initialized with level " +
2247 std::to_string(level_coarse) +
" but there are now" +
2248 "active cells on a lower level. Coarsening the mesh is " +
2249 "currently not supported"));
2259 boost::container::small_vector<std::pair<double, unsigned int>, 200>
2261 for (; cell !=
endc; ++cell)
2264 if (&cell->get_manifold() !=
this)
2286 for (
unsigned int i = 0; i < points.size(); ++i)
2297 for (
unsigned int i = 0; i < points.size(); ++i)
2300 quadratic_approximation[cell->index()].compute(points[i]);
2310 std::array<unsigned int, 20> cells;
2321template <
int dim,
int spacedim>
2328 ExcMessage(
"The chart points array view must be as large as the "
2329 "surrounding points array view."));
2358 ExcMessage(
"This function assumes that there are eight surrounding "
2359 "points around a two-dimensional object. It also assumes "
2360 "that the first three chart points have already been "
2409 ExcMessage(
"This function assumes that there are eight surrounding "
2410 "points around a three-dimensional object. It also "
2411 "assumes that the first five chart points have already "
2431 const double cosine = scalar_product(
v06,
v27) /
2437 else if (spacedim == 3)
2487 guess = quadratic_approximation[cell->index()].compute(
2501 guess = quadratic_approximation[cell->index()].compute(
2510 for (
unsigned int d = 0; d < dim; ++d)
2549 for (
unsigned int b = 0; b <= c; ++b)
2553 message <<
"Looking at cell " << cell->id()
2554 <<
" with vertices: " << std::endl;
2556 message << cell->vertex(v) <<
" ";
2558 message <<
"Transformation to chart coordinates: " << std::endl;
2582template <
int dim,
int spacedim>
2588 boost::container::small_vector<Point<dim>, 100>
chart_points(
2597 return push_forward(cell,
p_chart);
2602template <
int dim,
int spacedim>
2612 boost::container::small_vector<Point<dim>, 100>
chart_points(
2625 for (
unsigned int row = 0; row < weights.
size(0); ++row)
2632#include "manifold_lib.inst"
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &surrounding_points, const ArrayView< const double > &weights) const override
virtual Point< spacedim > push_forward(const Point< 3 > &chart_point) const override
virtual DerivativeForm< 1, 3, spacedim > push_forward_gradient(const Point< 3 > &chart_point) const override
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &surrounding_points, const ArrayView< const double > &weights) const override
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
CylindricalManifold(const unsigned int axis=0, const double tolerance=1e-10)
virtual Point< 3 > pull_back(const Point< spacedim > &space_point) const override
Tensor< 1, spacedim > direction
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
virtual Point< spacedim > push_forward(const Point< spacedim > &chart_point) const override
EllipticalManifold(const Point< spacedim > ¢er, const Tensor< 1, spacedim > &major_axis_direction, const double eccentricity)
virtual DerivativeForm< 1, spacedim, spacedim > push_forward_gradient(const Point< spacedim > &chart_point) const override
virtual Point< spacedim > pull_back(const Point< spacedim > &space_point) const override
static Tensor< 1, spacedim > get_periodicity()
SmartPointer< const Function< spacedim >, FunctionManifold< dim, spacedim, chartdim > > pull_back_function
const FunctionParser< spacedim >::ConstMap const_map
const std::string chart_vars
const std::string pull_back_expression
virtual DerivativeForm< 1, chartdim, spacedim > push_forward_gradient(const Point< chartdim > &chart_point) const override
SmartPointer< const Function< chartdim >, FunctionManifold< dim, spacedim, chartdim > > push_forward_function
const std::string space_vars
virtual Point< spacedim > push_forward(const Point< chartdim > &chart_point) const override
FunctionManifold(const Function< chartdim > &push_forward_function, const Function< spacedim > &pull_back_function, const Tensor< 1, chartdim > &periodicity=Tensor< 1, chartdim >(), const double tolerance=1e-10)
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
const std::string push_forward_expression
virtual Point< chartdim > pull_back(const Point< spacedim > &space_point) const override
virtual ~FunctionManifold() override
std::map< std::string, double > ConstMap
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, FaceVertexNormals &face_vertex_normals) const
std::array< Tensor< 1, spacedim >, GeometryInfo< dim >::vertices_per_face > FaceVertexNormals
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const
Abstract base class for mapping classes.
PolarManifold(const Point< spacedim > center=Point< spacedim >())
static Tensor< 1, spacedim > get_periodicity()
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
virtual DerivativeForm< 1, spacedim, spacedim > push_forward_gradient(const Point< spacedim > &chart_point) const override
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const override
virtual Point< spacedim > push_forward(const Point< spacedim > &chart_point) const override
virtual Point< spacedim > pull_back(const Point< spacedim > &space_point) const override
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &vertices, const ArrayView< const double > &weights) const override
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
virtual Point< spacedim > get_intermediate_point(const Point< spacedim > &p1, const Point< spacedim > &p2, const double w) const override
virtual void get_normals_at_vertices(const typename Triangulation< dim, spacedim >::face_iterator &face, typename Manifold< dim, spacedim >::FaceVertexNormals &face_vertex_normals) const override
std::pair< double, Tensor< 1, spacedim > > guess_new_point(const ArrayView< const Tensor< 1, spacedim > > &directions, const ArrayView< const double > &distances, const ArrayView< const double > &weights) const
virtual void get_new_points(const ArrayView< const Point< spacedim > > &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim > > new_points) const override
SphericalManifold(const Point< spacedim > center=Point< spacedim >())
virtual Tensor< 1, spacedim > get_tangent_vector(const Point< spacedim > &x1, const Point< spacedim > &x2) const override
virtual Tensor< 1, spacedim > normal_vector(const typename Triangulation< dim, spacedim >::face_iterator &face, const Point< spacedim > &p) const override
numbers::NumberTraits< Number >::real_type norm() const
virtual Point< 3 > pull_back(const Point< 3 > &p) const override
TorusManifold(const double R, const double r)
virtual DerivativeForm< 1, 3, 3 > push_forward_gradient(const Point< 3 > &chart_point) const override
virtual Point< 3 > push_forward(const Point< 3 > &chart_point) const override
virtual std::unique_ptr< Manifold< dim, 3 > > clone() const override
DerivativeForm< 1, dim, spacedim > push_forward_gradient(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &chart_point, const Point< spacedim > &pushed_forward_chart_point) const
void initialize(const Triangulation< dim, spacedim > &triangulation)
Triangulation< dim, spacedim >::cell_iterator compute_chart_points(const ArrayView< const Point< spacedim > > &surrounding_points, ArrayView< Point< dim > > chart_points) const
std::array< unsigned int, 20 > get_possible_cells_around_points(const ArrayView< const Point< spacedim > > &surrounding_points) const
Point< dim > pull_back(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p, const Point< dim > &initial_guess) const
virtual void get_new_points(const ArrayView< const Point< spacedim > > &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< spacedim > > new_points) const override
virtual Point< spacedim > get_new_point(const ArrayView< const Point< spacedim > > &surrounding_points, const ArrayView< const double > &weights) const override
Point< spacedim > push_forward(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &chart_point) const
virtual std::unique_ptr< Manifold< dim, spacedim > > clone() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcEmptyObject()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
Number signed_angle(const Tensor< 1, spacedim, Number > &a, const Tensor< 1, spacedim, Number > &b, const Tensor< 1, spacedim, Number > &axis)
Tensor< 1, 3 > projected_direction(const Tensor< 1, 3 > &u, const Tensor< 1, 3 > &v)
Tensor< 1, 3 > apply_exponential_map(const Tensor< 1, 3 > &u, const Tensor< 1, 3 > &dir)
static constexpr double invalid_pull_back_coordinate
Point< spacedim > compute_normal(const Tensor< 1, spacedim > &, bool=false)
static constexpr double PI
static const unsigned int invalid_unsigned_int
const types::manifold_id flat_manifold_id
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
static double distance_to_unit_cell(const Point< dim > &p)
static unsigned int face_to_cell_vertices(const unsigned int face, const unsigned int vertex, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false)
static Point< dim, Number > project_to_unit_cell(const Point< dim, Number > &p)
static unsigned int line_to_cell_vertices(const unsigned int line, const unsigned int vertex)
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices()
DEAL_II_HOST constexpr Number determinant(const SymmetricTensor< 2, dim, Number > &)
DEAL_II_HOST constexpr SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)
const ::Triangulation< dim, spacedim > & tria