--- /dev/null
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// Check SphericalManifold::normal_vector on a set of points of a
+// hypersphere mesh
+
+#include "../tests.h"
+#include <deal.II/base/point.h>
+#include <deal.II/grid/manifold_lib.h>
+#include <deal.II/grid/tria.h>
+#include <deal.II/grid/grid_generator.h>
+
+using namespace dealii;
+
+int
+main()
+{
+ initlog();
+ deallog << std::setprecision(3);
+
+ constexpr unsigned int dim = 3;
+ SphericalManifold<3> spherical;
+
+ Triangulation<dim> tria;
+ GridGenerator::hyper_shell(tria, Point<dim>(), 0.5, 1., 96, true);
+ tria.set_all_manifold_ids(0);
+ tria.set_manifold(0, spherical);
+
+ for (auto cell : tria.active_cell_iterators())
+ for (unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
+ if (cell->at_boundary(f))
+ {
+ if (std::abs(cell->face(f)->vertex(1).norm()-1.) < 1e-12)
+ {
+ // at outer boundary, the normal should point outwards and be
+ // aligned with the point down to roundoff. Check this for the
+ // second face vertex as well as the center.
+ deallog << "Outer normal correctness (should be 0): "
+ << (1.0 - cell->face(f)->vertex(1) *
+ spherical.normal_vector(cell->face(f), cell->face(f)->vertex(1)))
+ << " "
+ << (1.0 - cell->face(f)->center(/*respect_manifold=*/true) *
+ spherical.normal_vector(cell->face(f), cell->face(f)->center(true)))
+ << std::endl;
+ }
+ else if (std::abs(cell->face(f)->vertex(1).norm()-0.5) < 1e-12)
+ {
+ // at inner boundary, the normal should point inwards and be
+ // aligned with the point down to roundoff. Check this for the
+ // second face vertex as well as the center.
+ deallog << "Inner normal correctness (should be 0): "
+ << (0.5 - cell->face(f)->vertex(1) *
+ spherical.normal_vector(cell->face(f), cell->face(f)->vertex(1)))
+ << " "
+ << (0.5 - cell->face(f)->center(/*respect_manifold=*/true) *
+ spherical.normal_vector(cell->face(f), cell->face(f)->center(true)))
+ << std::endl;
+ }
+ }
+ for (auto cell : tria.active_cell_iterators())
+ for (unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
+ if (cell->at_boundary(f))
+ {
+ // the first choice will contain perturbations in the normal because
+ // the center without respecting the manifold is not on the face to
+ // which the algorithm computes its points. As an alternative, we
+ // adjust the point to lie on the same radius as the vertex points
+ // by a weighting where the normal should again be perfectly aligned
+ // with the point itself.
+ deallog << "Approximate normal in "
+ << cell->face(f)->center(false) << ": "
+ << spherical.normal_vector(cell->face(f), cell->face(f)->center(false))
+ << ", adjusted: "
+ << spherical.normal_vector(cell->face(f),
+ cell->face(f)->center(false)/cell->face(f)->center(false).norm()
+ *cell->face(f)->vertex(1).norm())
+ << std::endl;
+ }
+
+ return 0;
+}
--- /dev/null
+
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 0.00 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 0.00 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 2.22e-16 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 5.55e-17
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 1.11e-16
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 0.00 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 0.00 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 2.22e-16 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): -1.11e-16 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 -1.11e-16
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): -2.22e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 -2.22e-16
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Inner normal correctness (should be 0): 5.55e-17 0.00
+DEAL::Inner normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Outer normal correctness (should be 0): 1.11e-16 0.00
+DEAL::Outer normal correctness (should be 0): 0.00 0.00
+DEAL::Approximate normal in -0.170 -0.435 0.00: -0.519 -0.833 -0.193, adjusted: -0.363 -0.932 -2.53e-17
+DEAL::Approximate normal in -0.312 -0.312 0.153: -0.801 -0.592 0.0902, adjusted: -0.668 -0.668 0.328
+DEAL::Approximate normal in -0.312 -0.312 -0.153: -0.801 -0.592 -0.0902, adjusted: -0.668 -0.668 -0.328
+DEAL::Approximate normal in -0.435 -0.170 0.00: -0.833 -0.519 -0.193, adjusted: -0.932 -0.363 -1.58e-16
+DEAL::Approximate normal in -0.339 -0.871 0.00: -0.519 -0.833 -0.193, adjusted: -0.363 -0.932 -2.53e-17
+DEAL::Approximate normal in -0.624 -0.624 0.307: -0.801 -0.592 0.0902, adjusted: -0.668 -0.668 0.328
+DEAL::Approximate normal in -0.624 -0.624 -0.307: -0.801 -0.592 -0.0902, adjusted: -0.668 -0.668 -0.328
+DEAL::Approximate normal in -0.871 -0.339 0.00: -0.833 -0.519 -0.193, adjusted: -0.932 -0.363 -1.58e-16
+DEAL::Approximate normal in -0.312 -0.153 0.312: -0.801 -0.0902 0.592, adjusted: -0.668 -0.328 0.668
+DEAL::Approximate normal in -0.170 -6.94e-18 0.435: -0.519 0.193 0.833, adjusted: -0.363 -1.87e-16 0.932
+DEAL::Approximate normal in -0.435 -6.94e-18 0.170: -0.833 0.193 0.519, adjusted: -0.932 1.58e-16 0.363
+DEAL::Approximate normal in -0.312 0.153 0.312: -0.801 0.0902 0.592, adjusted: -0.668 0.328 0.668
+DEAL::Approximate normal in -0.624 -0.307 0.624: -0.801 -0.0902 0.592, adjusted: -0.668 -0.328 0.668
+DEAL::Approximate normal in -0.339 -1.39e-17 0.871: -0.519 0.193 0.833, adjusted: -0.363 -1.87e-16 0.932
+DEAL::Approximate normal in -0.871 -1.39e-17 0.339: -0.833 0.193 0.519, adjusted: -0.932 1.58e-16 0.363
+DEAL::Approximate normal in -0.624 0.307 0.624: -0.801 0.0902 0.592, adjusted: -0.668 0.328 0.668
+DEAL::Approximate normal in 0.00 -0.435 0.170: -0.193 -0.833 0.519, adjusted: -2.53e-17 -0.932 0.363
+DEAL::Approximate normal in 0.153 -0.312 0.312: 0.0902 -0.592 0.801, adjusted: 0.328 -0.668 0.668
+DEAL::Approximate normal in -0.153 -0.312 0.312: -0.0902 -0.592 0.801, adjusted: -0.328 -0.668 0.668
+DEAL::Approximate normal in 0.00 -0.170 0.435: -0.193 -0.519 0.833, adjusted: -1.58e-16 -0.363 0.932
+DEAL::Approximate normal in 0.00 -0.871 0.339: -0.193 -0.833 0.519, adjusted: -2.53e-17 -0.932 0.363
+DEAL::Approximate normal in 0.307 -0.624 0.624: 0.0902 -0.592 0.801, adjusted: 0.328 -0.668 0.668
+DEAL::Approximate normal in -0.307 -0.624 0.624: -0.0902 -0.592 0.801, adjusted: -0.328 -0.668 0.668
+DEAL::Approximate normal in 0.00 -0.339 0.871: -0.193 -0.519 0.833, adjusted: -1.58e-16 -0.363 0.932
+DEAL::Approximate normal in 0.312 -0.312 -0.153: 0.592 -0.801 -0.0902, adjusted: 0.668 -0.668 -0.328
+DEAL::Approximate normal in 0.435 -0.170 -6.94e-18: 0.833 -0.519 0.193, adjusted: 0.932 -0.363 -1.87e-16
+DEAL::Approximate normal in 0.170 -0.435 -6.94e-18: 0.519 -0.833 0.193, adjusted: 0.363 -0.932 1.58e-16
+DEAL::Approximate normal in 0.312 -0.312 0.153: 0.592 -0.801 0.0902, adjusted: 0.668 -0.668 0.328
+DEAL::Approximate normal in 0.624 -0.624 -0.307: 0.592 -0.801 -0.0902, adjusted: 0.668 -0.668 -0.328
+DEAL::Approximate normal in 0.871 -0.339 -1.39e-17: 0.833 -0.519 0.193, adjusted: 0.932 -0.363 -1.87e-16
+DEAL::Approximate normal in 0.339 -0.871 -1.39e-17: 0.519 -0.833 0.193, adjusted: 0.363 -0.932 1.58e-16
+DEAL::Approximate normal in 0.624 -0.624 0.307: 0.592 -0.801 0.0902, adjusted: 0.668 -0.668 0.328
+DEAL::Approximate normal in 0.435 0.00 0.170: 0.833 -0.193 0.519, adjusted: 0.932 -2.53e-17 0.363
+DEAL::Approximate normal in 0.312 0.153 0.312: 0.592 0.0902 0.801, adjusted: 0.668 0.328 0.668
+DEAL::Approximate normal in 0.312 -0.153 0.312: 0.592 -0.0902 0.801, adjusted: 0.668 -0.328 0.668
+DEAL::Approximate normal in 0.170 0.00 0.435: 0.519 -0.193 0.833, adjusted: 0.363 -1.58e-16 0.932
+DEAL::Approximate normal in 0.871 0.00 0.339: 0.833 -0.193 0.519, adjusted: 0.932 -2.53e-17 0.363
+DEAL::Approximate normal in 0.624 0.307 0.624: 0.592 0.0902 0.801, adjusted: 0.668 0.328 0.668
+DEAL::Approximate normal in 0.624 -0.307 0.624: 0.592 -0.0902 0.801, adjusted: 0.668 -0.328 0.668
+DEAL::Approximate normal in 0.339 0.00 0.871: 0.519 -0.193 0.833, adjusted: 0.363 -1.58e-16 0.932
+DEAL::Approximate normal in 0.153 0.312 0.312: 0.0902 0.592 0.801, adjusted: 0.328 0.668 0.668
+DEAL::Approximate normal in 6.94e-18 0.435 0.170: -0.193 0.833 0.519, adjusted: 1.87e-16 0.932 0.363
+DEAL::Approximate normal in 6.94e-18 0.170 0.435: -0.193 0.519 0.833, adjusted: -1.58e-16 0.363 0.932
+DEAL::Approximate normal in -0.153 0.312 0.312: -0.0902 0.592 0.801, adjusted: -0.328 0.668 0.668
+DEAL::Approximate normal in 0.307 0.624 0.624: 0.0902 0.592 0.801, adjusted: 0.328 0.668 0.668
+DEAL::Approximate normal in 1.39e-17 0.871 0.339: -0.193 0.833 0.519, adjusted: 1.87e-16 0.932 0.363
+DEAL::Approximate normal in 1.39e-17 0.339 0.871: -0.193 0.519 0.833, adjusted: -1.58e-16 0.363 0.932
+DEAL::Approximate normal in -0.307 0.624 0.624: -0.0902 0.592 0.801, adjusted: -0.328 0.668 0.668
+DEAL::Approximate normal in 0.435 0.170 0.00: 0.833 0.519 0.193, adjusted: 0.932 0.363 2.53e-17
+DEAL::Approximate normal in 0.312 0.312 -0.153: 0.592 0.801 -0.0902, adjusted: 0.668 0.668 -0.328
+DEAL::Approximate normal in 0.312 0.312 0.153: 0.592 0.801 0.0902, adjusted: 0.668 0.668 0.328
+DEAL::Approximate normal in 0.170 0.435 0.00: 0.519 0.833 0.193, adjusted: 0.363 0.932 1.58e-16
+DEAL::Approximate normal in 0.871 0.339 0.00: 0.833 0.519 0.193, adjusted: 0.932 0.363 2.53e-17
+DEAL::Approximate normal in 0.624 0.624 -0.307: 0.592 0.801 -0.0902, adjusted: 0.668 0.668 -0.328
+DEAL::Approximate normal in 0.624 0.624 0.307: 0.592 0.801 0.0902, adjusted: 0.668 0.668 0.328
+DEAL::Approximate normal in 0.339 0.871 0.00: 0.519 0.833 0.193, adjusted: 0.363 0.932 1.58e-16
+DEAL::Approximate normal in 0.312 -0.153 -0.312: 0.801 -0.0902 -0.592, adjusted: 0.668 -0.328 -0.668
+DEAL::Approximate normal in 0.170 -6.94e-18 -0.435: 0.519 0.193 -0.833, adjusted: 0.363 -1.87e-16 -0.932
+DEAL::Approximate normal in 0.435 -6.94e-18 -0.170: 0.833 0.193 -0.519, adjusted: 0.932 1.58e-16 -0.363
+DEAL::Approximate normal in 0.312 0.153 -0.312: 0.801 0.0902 -0.592, adjusted: 0.668 0.328 -0.668
+DEAL::Approximate normal in 0.624 -0.307 -0.624: 0.801 -0.0902 -0.592, adjusted: 0.668 -0.328 -0.668
+DEAL::Approximate normal in 0.339 -1.39e-17 -0.871: 0.519 0.193 -0.833, adjusted: 0.363 -1.87e-16 -0.932
+DEAL::Approximate normal in 0.871 -1.39e-17 -0.339: 0.833 0.193 -0.519, adjusted: 0.932 1.58e-16 -0.363
+DEAL::Approximate normal in 0.624 0.307 -0.624: 0.801 0.0902 -0.592, adjusted: 0.668 0.328 -0.668
+DEAL::Approximate normal in 0.00 0.170 -0.435: 0.193 0.519 -0.833, adjusted: 4.18e-16 0.363 -0.932
+DEAL::Approximate normal in -0.153 0.312 -0.312: -0.0902 0.801 -0.592, adjusted: -0.328 0.668 -0.668
+DEAL::Approximate normal in 0.153 0.312 -0.312: 0.0902 0.801 -0.592, adjusted: 0.328 0.668 -0.668
+DEAL::Approximate normal in 0.00 0.435 -0.170: 0.193 0.833 -0.519, adjusted: 1.58e-16 0.932 -0.363
+DEAL::Approximate normal in 0.00 0.339 -0.871: 0.193 0.519 -0.833, adjusted: 4.18e-16 0.363 -0.932
+DEAL::Approximate normal in -0.307 0.624 -0.624: -0.0902 0.801 -0.592, adjusted: -0.328 0.668 -0.668
+DEAL::Approximate normal in 0.307 0.624 -0.624: 0.0902 0.801 -0.592, adjusted: 0.328 0.668 -0.668
+DEAL::Approximate normal in 0.00 0.871 -0.339: 0.193 0.833 -0.519, adjusted: 1.58e-16 0.932 -0.363
+DEAL::Approximate normal in -0.312 0.312 -0.153: -0.592 0.801 -0.0902, adjusted: -0.668 0.668 -0.328
+DEAL::Approximate normal in -0.435 0.170 -6.94e-18: -0.833 0.519 0.193, adjusted: -0.932 0.363 -1.87e-16
+DEAL::Approximate normal in -0.170 0.435 -6.94e-18: -0.519 0.833 0.193, adjusted: -0.363 0.932 1.58e-16
+DEAL::Approximate normal in -0.312 0.312 0.153: -0.592 0.801 0.0902, adjusted: -0.668 0.668 0.328
+DEAL::Approximate normal in -0.624 0.624 -0.307: -0.592 0.801 -0.0902, adjusted: -0.668 0.668 -0.328
+DEAL::Approximate normal in -0.871 0.339 -1.39e-17: -0.833 0.519 0.193, adjusted: -0.932 0.363 -1.87e-16
+DEAL::Approximate normal in -0.339 0.871 -1.39e-17: -0.519 0.833 0.193, adjusted: -0.363 0.932 1.58e-16
+DEAL::Approximate normal in -0.624 0.624 0.307: -0.592 0.801 0.0902, adjusted: -0.668 0.668 0.328
+DEAL::Approximate normal in -0.170 0.00 -0.435: -0.519 0.193 -0.833, adjusted: -0.363 4.18e-16 -0.932
+DEAL::Approximate normal in -0.312 -0.153 -0.312: -0.801 -0.0902 -0.592, adjusted: -0.668 -0.328 -0.668
+DEAL::Approximate normal in -0.312 0.153 -0.312: -0.801 0.0902 -0.592, adjusted: -0.668 0.328 -0.668
+DEAL::Approximate normal in -0.435 0.00 -0.170: -0.833 0.193 -0.519, adjusted: -0.932 1.58e-16 -0.363
+DEAL::Approximate normal in -0.339 0.00 -0.871: -0.519 0.193 -0.833, adjusted: -0.363 4.18e-16 -0.932
+DEAL::Approximate normal in -0.624 -0.307 -0.624: -0.801 -0.0902 -0.592, adjusted: -0.668 -0.328 -0.668
+DEAL::Approximate normal in -0.624 0.307 -0.624: -0.801 0.0902 -0.592, adjusted: -0.668 0.328 -0.668
+DEAL::Approximate normal in -0.871 0.00 -0.339: -0.833 0.193 -0.519, adjusted: -0.932 1.58e-16 -0.363
+DEAL::Approximate normal in 0.153 -0.312 -0.312: 0.0902 -0.592 -0.801, adjusted: 0.328 -0.668 -0.668
+DEAL::Approximate normal in 6.94e-18 -0.435 -0.170: -0.193 -0.833 -0.519, adjusted: 1.87e-16 -0.932 -0.363
+DEAL::Approximate normal in 6.94e-18 -0.170 -0.435: -0.193 -0.519 -0.833, adjusted: -1.58e-16 -0.363 -0.932
+DEAL::Approximate normal in -0.153 -0.312 -0.312: -0.0902 -0.592 -0.801, adjusted: -0.328 -0.668 -0.668
+DEAL::Approximate normal in 0.307 -0.624 -0.624: 0.0902 -0.592 -0.801, adjusted: 0.328 -0.668 -0.668
+DEAL::Approximate normal in 1.39e-17 -0.871 -0.339: -0.193 -0.833 -0.519, adjusted: 1.87e-16 -0.932 -0.363
+DEAL::Approximate normal in 1.39e-17 -0.339 -0.871: -0.193 -0.519 -0.833, adjusted: -1.58e-16 -0.363 -0.932
+DEAL::Approximate normal in -0.307 -0.624 -0.624: -0.0902 -0.592 -0.801, adjusted: -0.328 -0.668 -0.668
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2017 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+// Compare SphericalManifold::normal_vector with the result of
+// FEFaceValues::normal_vector. Those should give very similar results, but an
+// old implementation in the manifold gave wrong points
+
+#include "../tests.h"
+#include <deal.II/base/point.h>
+#include <deal.II/grid/manifold_lib.h>
+#include <deal.II/grid/tria.h>
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/fe/fe_values.h>
+#include <deal.II/fe/fe_nothing.h>
+#include <deal.II/fe/mapping_q_generic.h>
+
+using namespace dealii;
+
+int
+main()
+{
+ initlog();
+ deallog << std::setprecision(8);
+
+ constexpr unsigned int dim = 3;
+ SphericalManifold<3> spherical;
+
+ Triangulation<dim> tria;
+ GridGenerator::hyper_shell(tria, Point<dim>(), 0.5, 1., 96, true);
+ tria.set_all_manifold_ids(0);
+ tria.set_manifold(0, spherical);
+
+ MappingQGeneric<dim> mapping(4);
+ QGaussLobatto<dim-1> quadrature(4);
+ FE_Nothing<dim> dummy;
+ FEFaceValues<dim> fe_values(mapping, dummy, quadrature,
+ update_normal_vectors | update_quadrature_points);
+
+ for (auto cell : tria.active_cell_iterators())
+ for (unsigned int f=0; f<GeometryInfo<dim>::faces_per_cell; ++f)
+ {
+ fe_values.reinit(cell, f);
+
+ // all points should coincide to an accuracy of at least 1e-8 (note
+ // that we use a 4-th degree mapping, so its accuracy on the 96 cell
+ // version of the sphere should but be enough)
+ const double tolerance = 1e-8;
+ for (unsigned int q=0; q<quadrature.size(); ++q)
+ {
+ const Tensor<1,dim> normal_manifold =
+ spherical.normal_vector(cell->face(f), fe_values.quadrature_point(q));
+ const Tensor<1,dim> normal_feval = fe_values.normal_vector(q);
+ if (std::abs(1.0 - std::abs(normal_manifold * normal_feval)) > tolerance)
+ deallog << "Error in point " << fe_values.quadrature_point(q) << ": "
+ << "FEFaceValues says " << normal_feval << " but manifold says "
+ << normal_manifold << std::endl;
+ }
+ }
+ deallog << "OK" << std::endl;
+
+ return 0;
+}