]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add constexpr array with unit tangential vectors
authorMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Fri, 28 Feb 2020 18:27:16 +0000 (19:27 +0100)
committerMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Sat, 29 Feb 2020 10:01:03 +0000 (11:01 +0100)
include/deal.II/base/geometry_info.h
source/base/geometry_info.cc

index 34766592b4198d9a435fdc291e4ff63a72979e43..b53b6c57a542648fcb2b7df214c0ed1bdde740fd 100644 (file)
@@ -68,6 +68,12 @@ namespace internal
         return {{Tensor<1, 1>{{-1}}, Tensor<1, 1>{{1}}}};
       }
 
+      static constexpr std::array<std::array<Tensor<1, 1>, 0>, 2>
+      unit_tangential_vectors()
+      {
+        return {{{}, {}}};
+      }
+
       static constexpr std::array<unsigned int, 2>
       opposite_face()
       {
@@ -117,6 +123,15 @@ namespace internal
                  Tensor<1, 2>{{0., 1.}}}};
       }
 
+      static constexpr std::array<std::array<Tensor<1, 2>, 1>, 4>
+      unit_tangential_vectors()
+      {
+        return {{{Tensor<1, 2>{{0, -1}}},
+                 {Tensor<1, 2>{{0, 1}}},
+                 {Tensor<1, 2>{{1, 0}}},
+                 {Tensor<1, 2>{{-1, 0}}}}};
+      }
+
       static constexpr std::array<unsigned int, 4>
       opposite_face()
       {
@@ -168,6 +183,17 @@ namespace internal
                  Tensor<1, 3>{{0, 0, 1}}}};
       }
 
+      static constexpr std::array<std::array<Tensor<1, 3>, 2>, 6>
+      unit_tangential_vectors()
+      {
+        return {{{Tensor<1, 3>{{0, -1, 0}}, Tensor<1, 3>{{0, 0, 1}}},
+                 {Tensor<1, 3>{{0, 1, 0}}, Tensor<1, 3>{{0, 0, 1}}},
+                 {Tensor<1, 3>{{0, 0, -1}}, Tensor<1, 3>{{1, 0, 0}}},
+                 {Tensor<1, 3>{{0, 0, 1}}, Tensor<1, 3>{{1, 0, 0}}},
+                 {Tensor<1, 3>{{-1, 0, 0}}, Tensor<1, 3>{{0, 1, 0}}},
+                 {Tensor<1, 3>{{1, 0, 0}}, Tensor<1, 3>{{0, 1, 0}}}}};
+      }
+
       static constexpr std::array<unsigned int, 6>
       opposite_face()
       {
@@ -243,6 +269,35 @@ namespace internal
                  Tensor<1, 4>{{0, 0, 0, 1}}}};
       }
 
+      static constexpr std::array<std::array<Tensor<1, 4>, 3>, 8>
+      unit_tangential_vectors()
+      {
+        return {{{Tensor<1, 4>{{0, -1, 0, 0}},
+                  Tensor<1, 4>{{0, 0, 1, 0}},
+                  Tensor<1, 4>{{0, 0, 0, 1}}},
+                 {Tensor<1, 4>{{0, 1, 0, 0}},
+                  Tensor<1, 4>{{0, 0, 1, 0}},
+                  Tensor<1, 4>{{0, 0, 0, 1}}},
+                 {Tensor<1, 4>{{0, 0, -1, 0}},
+                  Tensor<1, 4>{{0, 0, 0, 1}},
+                  Tensor<1, 4>{{1, 0, 0, 0}}},
+                 {Tensor<1, 4>{{0, 0, 1, 0}},
+                  Tensor<1, 4>{{0, 0, 0, 1}},
+                  Tensor<1, 4>{{1, 0, 0, 0}}},
+                 {Tensor<1, 4>{{0, 0, 0, -1}},
+                  Tensor<1, 4>{{1, 0, 0, 0}},
+                  Tensor<1, 4>{{0, 1, 0, 0}}},
+                 {Tensor<1, 4>{{0, 0, 0, 1}},
+                  Tensor<1, 4>{{1, 0, 0, 0}},
+                  Tensor<1, 4>{{0, 1, 0, 0}}},
+                 {Tensor<1, 4>{{-1, 0, 0, 0}},
+                  Tensor<1, 4>{{0, 1, 0, 0}},
+                  Tensor<1, 4>{{0, 0, 1, 0}}},
+                 {Tensor<1, 4>{{1, 0, 0, 0}},
+                  Tensor<1, 4>{{0, 1, 0, 0}},
+                  Tensor<1, 4>{{0, 0, 1, 0}}}}};
+      }
+
       static constexpr std::array<unsigned int, 8>
       opposite_face()
       {
@@ -2433,6 +2488,24 @@ struct GeometryInfo
     unit_normal_vector =
       internal::GeometryInfoHelper::Initializers<dim>::unit_normal_vector();
 
+  /**
+   * Unit tangential vectors (array of `dim-1` elements of Point<dim>) of a
+   * face of the reference cell, arranged in a right-hand coordinate system
+   * such that the cross product between the two vectors return the unit
+   * normal vector.
+   *
+   * Note that this is only the <em>standard orientation</em> of faces. At
+   * least in 3d, actual faces of cells in a triangulation can also have the
+   * opposite orientation, depending on a flag that one can query from the
+   * cell it belongs to. For more information, see the
+   * @ref GlossFaceOrientation "glossary"
+   * entry on face orientation.
+   */
+  static constexpr std::array<std::array<Tensor<1, dim>, dim - 1>,
+                              faces_per_cell>
+    unit_tangential_vectors = internal::GeometryInfoHelper::Initializers<
+      dim>::unit_tangential_vectors();
+
   /**
    * List of numbers which denotes which face is opposite to a given face. Its
    * entries are the first <tt>2*dim</tt> entries of <tt>{ 1, 0, 3, 2, 5, 4,
index 5eb62128161345b74ee8b03aa2e4acaac8619ef2..3ffd6153984170d7f71e4d2a1e3c51fdd1fe9448 100644 (file)
@@ -57,6 +57,11 @@ template <int dim>
 constexpr std::array<Tensor<1, dim>, GeometryInfo<dim>::faces_per_cell>
   GeometryInfo<dim>::unit_normal_vector;
 
+template <int dim>
+constexpr std::array<std::array<Tensor<1, dim>, dim - 1>,
+                     GeometryInfo<dim>::faces_per_cell>
+  GeometryInfo<dim>::unit_tangential_vectors;
+
 template <int dim>
 constexpr std::array<unsigned int, GeometryInfo<dim>::vertices_per_cell>
   GeometryInfo<dim>::dx_to_deal;

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.