]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Inroduce Triangulation::contains_cell() 15816/head
authorPeter Munch <peterrmuench@gmail.com>
Tue, 1 Aug 2023 16:52:48 +0000 (18:52 +0200)
committerPeter Munch <peterrmuench@gmail.com>
Sat, 5 Aug 2023 12:34:26 +0000 (14:34 +0200)
doc/news/changes/minor/20230801Munch [new file with mode: 0644]
include/deal.II/grid/tria.h
source/distributed/fully_distributed_tria.cc
source/grid/tria.cc

diff --git a/doc/news/changes/minor/20230801Munch b/doc/news/changes/minor/20230801Munch
new file mode 100644 (file)
index 0000000..f1df78a
--- /dev/null
@@ -0,0 +1,5 @@
+New: The function Triangulation::contains_cell()
+allows to check if Tringulation::create_cell_iterator()
+can be called for a specific cell id.
+<br>
+(Peter Munch, 2023/08/01)
index d65345be1a2117b960bf6dca8688da961ecde99e..5dac93b8a203f974105eadfb45c0b09e10e36704 100644 (file)
@@ -2994,16 +2994,24 @@ public:
    * Return an iterator to a cell of this Triangulation object constructed from
    * an independent CellId object.
    *
-   * If the given argument corresponds to a valid cell in this triangulation,
-   * this operation will always succeed for sequential triangulations where the
-   * current processor stores all cells that are part of the triangulation. On
-   * the other hand, if this is a parallel triangulation, then the current
-   * processor may not actually know about this cell. In this case, this
-   * operation will succeed for locally relevant cells, but may not for
-   * artificial cells that are less refined on the current processor.
+   * @note See the documentation of contains_cell() about which CellId objects
+   * are valid.
    */
   cell_iterator
   create_cell_iterator(const CellId &cell_id) const;
+
+  /**
+   * Check if the triangulation contains a cell with the id @p cell_id.
+   * If the given argument corresponds to a valid cell in this triangulation,
+   * this operation will always return true for sequential triangulations where
+   * the current processor stores all cells that are part of the triangulation.
+   * On the other hand, if this is a parallel triangulation, then the current
+   * processor may not actually know about this cell. In this case, this
+   * operation will return true for locally relevant cells, but may return false
+   * for artificial cells that are less refined on the current processor.
+   */
+  bool
+  contains_cell(const CellId &cell_id) const;
   /** @} */
 
   /**
@@ -4422,7 +4430,9 @@ private:
    *
    * @note For serial and shared triangulation both id and index are the same.
    *       For distributed triangulations setting both might differ, since the
-   *       id might correspond to a global id and the index to a local id.
+   *       id might correspond to a global id and the index to a local id. If
+   *       a cell does not exist locally, the returned value is
+   *       numbers::invalid_unsigned_int.
    *
    * @param coarse_cell_id Unique id of the coarse cell.
    * @return Index of the coarse cell within the current triangulation.
index 17e7c2ff244d138e721b1f311c85ebcd60444695..e3a7d82a59102f53d742dd771b743641edb2d2cd 100644 (file)
@@ -410,10 +410,11 @@ namespace parallel
         coarse_cell_id,
         [](const std::pair<types::coarse_cell_id, unsigned int> &pair,
            const types::coarse_cell_id &val) { return pair.first < val; });
-      Assert(coarse_cell_index !=
-               coarse_cell_id_to_coarse_cell_index_vector.cend(),
-             ExcMessage("Coarse cell index not found!"));
-      return coarse_cell_index->second;
+      if (coarse_cell_index !=
+          coarse_cell_id_to_coarse_cell_index_vector.cend())
+        return coarse_cell_index->second;
+      else
+        return numbers::invalid_unsigned_int; // cell could no be found
     }
 
 
index 09a5748f2fe16fece871036e5926c218bea7fc22..dee32a5eb347b77621b2b7fe0b9eb3be8d0f779b 100644 (file)
@@ -14213,23 +14213,48 @@ typename Triangulation<dim, spacedim>::cell_iterator
   Triangulation<dim, spacedim>::create_cell_iterator(
     const CellId &cell_id) const
 {
+  Assert(
+    this->contains_cell(cell_id),
+    ExcMessage(
+      "CellId is invalid for this triangulation.\n"
+      "Either the provided CellId does not correspond to a cell in this "
+      "triangulation object, or, in case you are using a parallel "
+      "triangulation, may correspond to an artificial cell that is less "
+      "refined on this processor. In the case of "
+      "parallel::fullydistributed::Triangulation, the corresponding coarse "
+      "cell might not be accessible by the current process."));
+
   cell_iterator cell(
     this, 0, coarse_cell_id_to_coarse_cell_index(cell_id.get_coarse_cell_id()));
 
+  for (const auto &child_index : cell_id.get_child_indices())
+    cell = cell->child(static_cast<unsigned int>(child_index));
+
+  return cell;
+}
+
+
+
+template <int dim, int spacedim>
+DEAL_II_CXX20_REQUIRES((concepts::is_valid_dim_spacedim<dim, spacedim>))
+bool Triangulation<dim, spacedim>::contains_cell(const CellId &cell_id) const
+{
+  const auto coarse_cell_index =
+    coarse_cell_id_to_coarse_cell_index(cell_id.get_coarse_cell_id());
+
+  if (coarse_cell_index == numbers::invalid_unsigned_int)
+    return false;
+
+  cell_iterator cell(this, 0, coarse_cell_index);
+
   for (const auto &child_index : cell_id.get_child_indices())
     {
-      Assert(
-        cell->has_children(),
-        ExcMessage(
-          "CellId is invalid for this triangulation.\n"
-          "Either the provided CellId does not correspond to a cell in this "
-          "triangulation object, or, in case you are using a parallel "
-          "triangulation, may correspond to an artificial cell that is less "
-          "refined on this processor."));
+      if (cell->has_children() == false)
+        return false;
       cell = cell->child(static_cast<unsigned int>(child_index));
     }
 
-  return cell;
+  return true;
 }
 
 

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.