]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Implement two helper index functions in (Cell,Tria)Accessor.
authorDavid Wells <drwells@email.unc.edu>
Sun, 27 Oct 2019 19:13:33 +0000 (15:13 -0400)
committerDavid Wells <drwells@email.unc.edu>
Sun, 27 Oct 2019 22:35:05 +0000 (18:35 -0400)
doc/news/changes/minor/20191027DavidWells-2 [new file with mode: 0644]
include/deal.II/grid/tria_accessor.h
include/deal.II/grid/tria_accessor.templates.h

diff --git a/doc/news/changes/minor/20191027DavidWells-2 b/doc/news/changes/minor/20191027DavidWells-2
new file mode 100644 (file)
index 0000000..ea7c103
--- /dev/null
@@ -0,0 +1,5 @@
+New: Added convenience functions CellAccessor::face_iterator_to_index()
+and TriaAccessor::child_iterator_to_index() for computing face and child numbers
+from iterators.
+<br>
+(David Wells, 2019/10/27)
index b0d530c8cbe9fac46f8cbd8e16178eaf2a7232e9..f961522042b0b185661476d5b1d1d8e6f3c64439 100644 (file)
@@ -982,6 +982,14 @@ public:
   TriaIterator<TriaAccessor<structdim, dim, spacedim>>
   child(const unsigned int i) const;
 
+  /**
+   * Return the child number of @p child on the current cell. This is the
+   * inverse function of TriaAccessor::child().
+   */
+  unsigned int
+  child_iterator_to_index(
+    const TriaIterator<TriaAccessor<structdim, dim, spacedim>> &child) const;
+
   /**
    * Return an iterator to that object that is identical to the ith child for
    * isotropic refinement. If the current object is refined isotropically,
@@ -2044,6 +2052,12 @@ public:
   static unsigned int
   max_refinement_depth();
 
+  /**
+   * @brief Return an invalid unsigned integer.
+   */
+  static unsigned int
+  child_iterator_to_index(const TriaIterator<TriaAccessor<0, dim, spacedim>> &);
+
   /**
    * @brief Return an invalid object.
    */
@@ -2497,6 +2511,12 @@ public:
   static unsigned int
   max_refinement_depth();
 
+  /**
+   * @brief Return an invalid unsigned integer.
+   */
+  static unsigned int
+  child_iterator_to_index(const TriaIterator<TriaAccessor<0, 1, spacedim>> &);
+
   /**
    * @brief Return an invalid object
    */
@@ -2735,6 +2755,13 @@ public:
   TriaIterator<TriaAccessor<dim - 1, dim, spacedim>>
   face(const unsigned int i) const;
 
+  /**
+   * Return the face number of @p face on the current cell. This is the
+   * inverse function of TriaAccessor::face().
+   */
+  unsigned int
+  face_iterator_to_index(
+    const TriaIterator<TriaAccessor<dim - 1, dim, spacedim>> &face) const;
 
   /**
    * Return an array of iterators to all faces of this cell.
index 13d98ab32266c3041ba9161e215720e9c9d857f1..01c730bf4e37778f9e3422111081266fecb681ee 100644 (file)
@@ -1510,6 +1510,23 @@ TriaAccessor<structdim, dim, spacedim>::child(const unsigned int i) const
 
 
 
+template <int structdim, int dim, int spacedim>
+inline unsigned int
+TriaAccessor<structdim, dim, spacedim>::child_iterator_to_index(
+  const TriaIterator<TriaAccessor<structdim, dim, spacedim>> &child) const
+{
+  const auto n_children = this->n_children();
+  for (unsigned int child_n = 0; child_n < n_children; ++child_n)
+    if (this->child(child_n) == child)
+      return child_n;
+
+  Assert(false,
+         ExcMessage("The given child is not a child of the current object."));
+  return numbers::invalid_unsigned_int;
+}
+
+
+
 template <int structdim, int dim, int spacedim>
 inline TriaIterator<TriaAccessor<structdim, dim, spacedim>>
 TriaAccessor<structdim, dim, spacedim>::isotropic_child(
@@ -2590,6 +2607,16 @@ TriaAccessor<0, dim, spacedim>::max_refinement_depth()
 
 
 
+template <int dim, int spacedim>
+inline unsigned int
+TriaAccessor<0, dim, spacedim>::child_iterator_to_index(
+  const TriaIterator<TriaAccessor<0, dim, spacedim>> &)
+{
+  return numbers::invalid_unsigned_int;
+}
+
+
+
 template <int dim, int spacedim>
 inline TriaIterator<TriaAccessor<0, dim, spacedim>>
 TriaAccessor<0, dim, spacedim>::child(const unsigned int)
@@ -3004,6 +3031,17 @@ TriaAccessor<0, 1, spacedim>::max_refinement_depth()
 }
 
 
+
+template <int spacedim>
+inline unsigned int
+TriaAccessor<0, 1, spacedim>::child_iterator_to_index(
+  const TriaIterator<TriaAccessor<0, 1, spacedim>> &)
+{
+  return numbers::invalid_unsigned_int;
+}
+
+
+
 template <int spacedim>
 inline TriaIterator<TriaAccessor<0, 1, spacedim>>
 TriaAccessor<0, 1, spacedim>::child(const unsigned int)
@@ -3181,6 +3219,23 @@ CellAccessor<dim, spacedim>::face(const unsigned int i) const
 
 
 
+template <int dim, int spacedim>
+inline unsigned int
+CellAccessor<dim, spacedim>::face_iterator_to_index(
+  const TriaIterator<TriaAccessor<dim - 1, dim, spacedim>> &face) const
+{
+  for (unsigned int face_n = 0; face_n < GeometryInfo<dim>::faces_per_cell;
+       ++face_n)
+    if (this->face(face_n) == face)
+      return face_n;
+
+  Assert(false,
+         ExcMessage("The given face is not a face of the current cell."));
+  return numbers::invalid_unsigned_int;
+}
+
+
+
 template <int dim, int spacedim>
 inline std::array<TriaIterator<TriaAccessor<dim - 1, dim, spacedim>>,
                   GeometryInfo<dim>::faces_per_cell>

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.