]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add GeometryInfo::vertex_indices().
authorWolfgang Bangerth <bangerth@colostate.edu>
Wed, 4 Mar 2020 22:29:17 +0000 (15:29 -0700)
committerWolfgang Bangerth <bangerth@colostate.edu>
Thu, 5 Mar 2020 04:31:17 +0000 (21:31 -0700)
include/deal.II/base/geometry_info.h

index 966b584b7bda701670f22424383857f09e368523..1f15383965ffbe746fe7780bb48f893d4b1c6a05 100644 (file)
@@ -1301,6 +1301,27 @@ struct GeometryInfo<0>
    */
   static constexpr unsigned int vertices_per_cell = 1;
 
+  /**
+   * Return an object that can be thought of as an array containing all
+   * indices from zero to `vertices_per_cell`. This allows to write code
+   * using range-based for loops of the following kind:
+   * @code
+   *   for (auto &cell : triangulation.active_cell_iterators())
+   *     for (auto vertex_index : GeometryInfo<dim>::vertex_indices())
+   *       if (cell->vertex(vertex_index) satisfies some condition)
+   *         ... do something ...
+   * @endcode
+   * Here, we are looping over all vertices of all cells, with `vertex_index`
+   * taking on all valid indices.
+   *
+   * Of course, since this class is for the case `dim==0`, the
+   * returned object is a array with just one entry: zero. That's
+   * because an of dimension zero is really just a single point,
+   * corresponding to a vertex itself.
+   */
+  static std::array<unsigned int, vertices_per_cell>
+  vertex_indices();
+
   /**
    * Number of vertices each face has. Since this is not useful in one
    * dimension, we provide a useless number (in the hope that a compiler may
@@ -1944,6 +1965,22 @@ struct GeometryInfo
    */
   static constexpr unsigned int vertices_per_cell = 1 << dim;
 
+  /**
+   * Return an object that can be thought of as an array containing all
+   * indices from zero to `vertices_per_cell`. This allows to write code
+   * using range-based for loops of the following kind:
+   * @code
+   *   for (auto &cell : triangulation.active_cell_iterators())
+   *     for (auto vertex_index : GeometryInfo<dim>::vertex_indices())
+   *       if (cell->vertex(vertex_index) satisfies some condition)
+   *         ... do something ...
+   * @endcode
+   * Here, we are looping over all vertices of all cells, with `vertex_index`
+   * taking on all valid indices.
+   */
+  static boost::integer_range<unsigned int>
+  vertex_indices();
+
   /**
    * Number of vertices on each face.
    */
@@ -2787,6 +2824,14 @@ GeometryInfo<0>::face_indices()
 
 
 
+inline std::array<unsigned int, 1>
+GeometryInfo<0>::vertex_indices()
+{
+  return {{0}};
+}
+
+
+
 template <int dim>
 inline boost::integer_range<unsigned int>
 GeometryInfo<dim>::face_indices()
@@ -2796,6 +2841,15 @@ GeometryInfo<dim>::face_indices()
 
 
 
+template <int dim>
+inline boost::integer_range<unsigned int>
+GeometryInfo<dim>::vertex_indices()
+{
+  return boost::irange(0U, vertices_per_cell);
+}
+
+
+
 template <int dim>
 inline Point<dim>
 GeometryInfo<dim>::unit_cell_vertex(const unsigned int)

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.