From a25c3d0a315d1efa32ab9f69f29095fc84484553 Mon Sep 17 00:00:00 2001
From: Daniel Arndt <arndtd@ornl.gov>
Date: Fri, 14 May 2021 11:29:09 -0400
Subject: [PATCH] Check return value of
 GridTools::find_active_cell_Around_point

---
 .../numerics/fe_field_function.templates.h    |  9 +++++---
 .../vector_tools_point_gradient.templates.h   |  6 ++++--
 .../vector_tools_point_value.templates.h      | 21 ++++++++++++++++---
 tests/mpi/muelu_periodicity.cc                | 13 ++++--------
 tests/mpi/periodicity_01.cc                   | 21 +++++++------------
 tests/mpi/periodicity_02.cc                   | 13 ++++--------
 tests/mpi/periodicity_03.cc                   | 17 +++++++--------
 7 files changed, 51 insertions(+), 49 deletions(-)

diff --git a/include/deal.II/numerics/fe_field_function.templates.h b/include/deal.II/numerics/fe_field_function.templates.h
index d659f1e89a..90dc040011 100644
--- a/include/deal.II/numerics/fe_field_function.templates.h
+++ b/include/deal.II/numerics/fe_field_function.templates.h
@@ -88,7 +88,8 @@ namespace Functions
                           ActiveCellIterator<dim, dim, DoFHandlerType>::type,
                         Point<dim>>
           my_pair = GridTools::find_active_cell_around_point(mapping, *dh, p);
-        AssertThrow(!my_pair.first->is_artificial(),
+        AssertThrow(my_pair.first.state() == IteratorState::valid &&
+                      !my_pair.first->is_artificial(),
                     VectorTools::ExcPointNotAvailableHere());
 
         cell = my_pair.first;
@@ -147,7 +148,8 @@ namespace Functions
                           ActiveCellIterator<dim, dim, DoFHandlerType>::type,
                         Point<dim>>
           my_pair = GridTools::find_active_cell_around_point(mapping, *dh, p);
-        AssertThrow(!my_pair.first->is_artificial(),
+        AssertThrow(my_pair.first.state() == IteratorState::valid &&
+                      !my_pair.first->is_artificial(),
                     VectorTools::ExcPointNotAvailableHere());
 
         cell = my_pair.first;
@@ -220,7 +222,8 @@ namespace Functions
                           ActiveCellIterator<dim, dim, DoFHandlerType>::type,
                         Point<dim>>
           my_pair = GridTools::find_active_cell_around_point(mapping, *dh, p);
-        AssertThrow(!my_pair.first->is_artificial(),
+        AssertThrow(my_pair.first.state() == IteratorState::valid &&
+                      !my_pair.first->is_artificial(),
                     VectorTools::ExcPointNotAvailableHere());
 
         cell = my_pair.first;
diff --git a/include/deal.II/numerics/vector_tools_point_gradient.templates.h b/include/deal.II/numerics/vector_tools_point_gradient.templates.h
index 01c9e0fe7a..b3fe37b385 100644
--- a/include/deal.II/numerics/vector_tools_point_gradient.templates.h
+++ b/include/deal.II/numerics/vector_tools_point_gradient.templates.h
@@ -105,7 +105,8 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof, point);
 
-    AssertThrow(cell_point.first->is_locally_owned(),
+    AssertThrow(cell_point.first.state() == IteratorState::valid &&
+                  cell_point.first->is_locally_owned(),
                 ExcPointNotAvailableHere());
     Assert(GeometryInfo<dim>::distance_to_unit_cell(cell_point.second) < 1e-10,
            ExcInternalError());
@@ -150,7 +151,8 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof, point);
 
-    AssertThrow(cell_point.first->is_locally_owned(),
+    AssertThrow(cell_point.first.state() == IteratorState::valid &&
+                  cell_point.first->is_locally_owned(),
                 ExcPointNotAvailableHere());
     Assert(GeometryInfo<dim>::distance_to_unit_cell(cell_point.second) < 1e-10,
            ExcInternalError());
diff --git a/include/deal.II/numerics/vector_tools_point_value.templates.h b/include/deal.II/numerics/vector_tools_point_value.templates.h
index 38050b11dc..5a1d9a4dd7 100644
--- a/include/deal.II/numerics/vector_tools_point_value.templates.h
+++ b/include/deal.II/numerics/vector_tools_point_value.templates.h
@@ -103,7 +103,8 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof, point);
 
-    AssertThrow(cell_point.first->is_locally_owned(),
+    AssertThrow(cell_point.first.state() == IteratorState::valid &&
+                  cell_point.first->is_locally_owned(),
                 ExcPointNotAvailableHere());
     Assert(GeometryInfo<dim>::distance_to_unit_cell(cell_point.second) < 1e-10,
            ExcInternalError());
@@ -145,7 +146,8 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof, point);
 
-    AssertThrow(cell_point.first->is_locally_owned(),
+    AssertThrow(cell_point.first.state() == IteratorState::valid &&
+                  cell_point.first->is_locally_owned(),
                 ExcPointNotAvailableHere());
     Assert(GeometryInfo<dim>::distance_to_unit_cell(cell_point.second) < 1e-10,
            ExcInternalError());
@@ -247,7 +249,8 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof, point);
 
-    AssertThrow(cell_point.first->is_locally_owned(),
+    AssertThrow(cell_point.first.state() == IteratorState::valid &&
+                  cell_point.first->is_locally_owned(),
                 ExcPointNotAvailableHere());
     Assert(GeometryInfo<dim>::distance_to_unit_cell(cell_point.second) < 1e-10,
            ExcInternalError());
@@ -290,6 +293,9 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof_handler, p);
 
+    AssertThrow(cell_point.first.state() == IteratorState::valid,
+                ExcPointNotAvailableHere());
+
     Quadrature<dim> q(
       GeometryInfo<dim>::project_to_unit_cell(cell_point.second));
 
@@ -351,6 +357,9 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof_handler, p);
 
+    AssertThrow(cell_point.first.state() == IteratorState::valid,
+                ExcPointNotAvailableHere());
+
     Quadrature<dim> q(
       GeometryInfo<dim>::project_to_unit_cell(cell_point.second));
 
@@ -393,6 +402,9 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof_handler, p);
 
+    AssertThrow(cell_point.first.state() == IteratorState::valid,
+                ExcPointNotAvailableHere());
+
     const Quadrature<dim> q(
       GeometryInfo<dim>::project_to_unit_cell(cell_point.second));
 
@@ -461,6 +473,9 @@ namespace VectorTools
       cell_point =
         GridTools::find_active_cell_around_point(mapping, dof_handler, p);
 
+    AssertThrow(cell_point.first.state() == IteratorState::valid,
+                ExcPointNotAvailableHere());
+
     Quadrature<dim> q(
       GeometryInfo<dim>::project_to_unit_cell(cell_point.second));
 
diff --git a/tests/mpi/muelu_periodicity.cc b/tests/mpi/muelu_periodicity.cc
index 8342b37d5d..bf59f64eec 100644
--- a/tests/mpi/muelu_periodicity.cc
+++ b/tests/mpi/muelu_periodicity.cc
@@ -584,16 +584,11 @@ namespace Step22
                                       const int        proc,
                                       Vector<double> & value) const
   {
-    try
-      {
-        typename DoFHandler<dim>::active_cell_iterator cell =
-          GridTools::find_active_cell_around_point(dof_handler, point);
+    typename DoFHandler<dim>::active_cell_iterator cell =
+      GridTools::find_active_cell_around_point(dof_handler, point);
 
-        if (cell->is_locally_owned())
-          VectorTools::point_value(dof_handler, solution, point, value);
-      }
-    catch (GridTools::ExcPointNotFound<dim> &p)
-      {}
+    if (cell.state() == IteratorState::valid && cell->is_locally_owned())
+      VectorTools::point_value(dof_handler, solution, point, value);
 
     std::vector<double> tmp(value.size());
     for (unsigned int i = 0; i < value.size(); ++i)
diff --git a/tests/mpi/periodicity_01.cc b/tests/mpi/periodicity_01.cc
index 720c3f7944..41672c0352 100644
--- a/tests/mpi/periodicity_01.cc
+++ b/tests/mpi/periodicity_01.cc
@@ -325,19 +325,14 @@ namespace Step40
                                        const int            proc,
                                        Vector<PetscScalar> &value) const
   {
-    try
-      {
-        typename DoFHandler<dim>::active_cell_iterator cell =
-          GridTools::find_active_cell_around_point(dof_handler, point);
-
-        if (cell->is_locally_owned())
-          VectorTools::point_value(dof_handler,
-                                   locally_relevant_solution,
-                                   point,
-                                   value);
-      }
-    catch (GridTools::ExcPointNotFound<dim> &p)
-      {}
+    typename DoFHandler<dim>::active_cell_iterator cell =
+      GridTools::find_active_cell_around_point(dof_handler, point);
+
+    if (cell.state() == IteratorState::valid && cell->is_locally_owned())
+      VectorTools::point_value(dof_handler,
+                               locally_relevant_solution,
+                               point,
+                               value);
 
     std::vector<double> tmp(value.size());
     std::vector<double> tmp2(value.size());
diff --git a/tests/mpi/periodicity_02.cc b/tests/mpi/periodicity_02.cc
index 4d51fdb634..491810684c 100644
--- a/tests/mpi/periodicity_02.cc
+++ b/tests/mpi/periodicity_02.cc
@@ -598,16 +598,11 @@ namespace Step22
                                       const int        proc,
                                       Vector<double> & value) const
   {
-    try
-      {
-        typename DoFHandler<dim>::active_cell_iterator cell =
-          GridTools::find_active_cell_around_point(dof_handler, point);
+    typename DoFHandler<dim>::active_cell_iterator cell =
+      GridTools::find_active_cell_around_point(dof_handler, point);
 
-        if (cell->is_locally_owned())
-          VectorTools::point_value(dof_handler, solution, point, value);
-      }
-    catch (GridTools::ExcPointNotFound<dim> &p)
-      {}
+    if (cell.state() == IteratorState::valid && cell->is_locally_owned())
+      VectorTools::point_value(dof_handler, solution, point, value);
 
     std::vector<double> tmp(value.size());
     for (unsigned int i = 0; i < value.size(); ++i)
diff --git a/tests/mpi/periodicity_03.cc b/tests/mpi/periodicity_03.cc
index 8d545e6033..01863565f6 100644
--- a/tests/mpi/periodicity_03.cc
+++ b/tests/mpi/periodicity_03.cc
@@ -509,20 +509,17 @@ namespace Step22
                                       const int        proc,
                                       Vector<double> & value) const
   {
-    try
-      {
-        const typename DoFHandler<dim>::active_cell_iterator cell =
-          GridTools::find_active_cell_around_point(dof_handler, point);
+    const typename DoFHandler<dim>::active_cell_iterator cell =
+      GridTools::find_active_cell_around_point(dof_handler, point);
 
+    if (cell.state() == IteratorState::valid)
+      {
         if (cell->is_locally_owned())
           VectorTools::point_value(dof_handler, solution, point, value);
       }
-    catch (GridTools::ExcPointNotFound<dim> &p)
-      {
-        pcout << "Point: " << point << " is not inside a non-artificial cell!"
-              << std::endl;
-      }
-
+    else
+      pcout << "Point: " << point << " is not inside a non-artificial cell!"
+            << std::endl;
 
     std::vector<double> tmp(value.size());
     for (unsigned int i = 0; i < value.size(); ++i)
-- 
2.39.5