]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix BoundingBox's Container ctor. 11494/head
authorDavid Wells <drwells@email.unc.edu>
Fri, 8 Jan 2021 03:09:16 +0000 (22:09 -0500)
committerDavid Wells <drwells@email.unc.edu>
Fri, 8 Jan 2021 03:25:57 +0000 (22:25 -0500)
I get inscrutably long boost errors right now (which was partially fixed in
13bc2f8a021) about boost not being able to figure out type conversions. Lets
just roll our own BoundingBox function to fix the problem here and with other
versions of boost.

include/deal.II/base/bounding_box.h
include/deal.II/grid/tria_accessor.h
tests/base/bounding_box_1.cc
tests/base/bounding_box_1.output

index 937783de0ebabc676a2dfd30007212efe459afa9..667af8dd6f598e2a92498c6a2ddcfd3fee3bae5c 100644 (file)
 #include <deal.II/base/point.h>
 #include <deal.II/base/utilities.h>
 
-DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
-#include <boost/geometry/algorithms/envelope.hpp>
-#include <boost/geometry/geometries/multi_point.hpp>
-#if DEAL_II_BOOST_VERSION_GTE(1, 75, 0)
-#  include <boost/geometry/strategies/envelope/cartesian.hpp>
-#endif
-DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
-
 DEAL_II_NAMESPACE_OPEN
 
 /**
@@ -165,6 +157,18 @@ public:
   const std::pair<Point<spacedim, Number>, Point<spacedim, Number>> &
   get_boundary_points() const;
 
+  /**
+   * Test for equality.
+   */
+  bool
+  operator==(const BoundingBox<spacedim, Number> &box) const;
+
+  /**
+   * Test for inequality.
+   */
+  bool
+  operator!=(const BoundingBox<spacedim, Number> &box) const;
+
   /**
    * Check if the current object and @p other_bbox are neighbors, i.e. if the boxes
    * have dimension spacedim, check if their intersection is non empty.
@@ -407,10 +411,46 @@ template <int spacedim, typename Number>
 template <class Container>
 inline BoundingBox<spacedim, Number>::BoundingBox(const Container &points)
 {
-  boost::geometry::envelope(
-    boost::geometry::model::multi_point<Point<spacedim, Number>>(points.begin(),
-                                                                 points.end()),
-    *this);
+  // Use the default constructor in case points is empty instead of setting
+  // things to +oo and -oo
+  if (points.size() > 0)
+    {
+      auto &min = boundary_points.first;
+      auto &max = boundary_points.second;
+      std::fill(min.begin_raw(),
+                min.end_raw(),
+                std::numeric_limits<Number>::infinity());
+      std::fill(max.begin_raw(),
+                max.end_raw(),
+                -std::numeric_limits<Number>::infinity());
+
+      for (const Point<spacedim, Number> &point : points)
+        for (unsigned int d = 0; d < spacedim; ++d)
+          {
+            min[d] = std::min(min[d], point[d]);
+            max[d] = std::max(max[d], point[d]);
+          }
+    }
+}
+
+
+
+template <int spacedim, typename Number>
+inline bool
+BoundingBox<spacedim, Number>::
+operator==(const BoundingBox<spacedim, Number> &box) const
+{
+  return boundary_points == box.boundary_points;
+}
+
+
+
+template <int spacedim, typename Number>
+inline bool
+BoundingBox<spacedim, Number>::
+operator!=(const BoundingBox<spacedim, Number> &box) const
+{
+  return boundary_points != box.boundary_points;
 }
 
 
index ae01e8f402b7659b06a5e0f2a95f9ee4ff239086..4b48fa4494bea2645f8775f85334de542addecd6 100644 (file)
@@ -29,6 +29,8 @@
 #include <deal.II/grid/tria_iterator_base.h>
 #include <deal.II/grid/tria_iterator_selector.h>
 
+#include <boost/container/small_vector.hpp>
+
 #include <utility>
 
 
index 7c4f9486a36cc963fa0877201023001bac2eaa37..3bd40d6cbcd8eee6727c814b336484479b0043c8 100644 (file)
@@ -67,6 +67,16 @@ test_bounding_box()
             << " is inside: " << b.point_inside(test_points[i]) << std::endl;
 
   deallog << std::endl;
+
+  // Verify that we get the same box when we use all those points together
+  {
+    test_points.push_back(boundaries.first);
+    test_points.push_back(boundaries.second);
+
+    BoundingBox<spacedim> b2(test_points);
+    deallog << "Boxes should be equal : " << (b2 == b) << std::endl;
+  }
+
   test_points.clear();
 
   // To create outside points we take a non-convex combination
@@ -86,6 +96,13 @@ test_bounding_box()
   for (unsigned int i = 0; i < test_points.size(); ++i)
     deallog << test_points[i]
             << " is inside: " << b.point_inside(test_points[i]) << std::endl;
+
+  // Similarly, verify that we get different boxes since some points are
+  // outside:
+  {
+    BoundingBox<spacedim> b2(test_points);
+    deallog << "Boxes should not be equal : " << (b2 != b) << std::endl;
+  }
   deallog << std::endl;
 }
 
index b44911a24576a92e862bd02ceb9b38be4444259b..0d37542091a1cee734085857e0e865b884664c29 100644 (file)
@@ -15,12 +15,14 @@ DEAL::0.440000 is inside: 1
 DEAL::0.320000 is inside: 1
 DEAL::0.200000 is inside: 1
 DEAL::
+DEAL::Boxes should be equal : 1
 DEAL::Points outside:
 DEAL::-2.50000 is inside: 0
 DEAL::5.00000 is inside: 0
 DEAL::-7.50000 is inside: 0
 DEAL::10.0000 is inside: 0
 DEAL::-12.5000 is inside: 0
+DEAL::Boxes should not be equal : 1
 DEAL::
 DEAL::
 DEAL::Test for dimension 2
@@ -38,12 +40,14 @@ DEAL::0.440000 0.640000 is inside: 1
 DEAL::0.320000 0.320000 is inside: 1
 DEAL::0.200000 0.00000 is inside: 1
 DEAL::
+DEAL::Boxes should be equal : 1
 DEAL::Points outside:
 DEAL::-2.50000 -4.00000 is inside: 0
 DEAL::5.00000 8.00000 is inside: 0
 DEAL::-7.50000 -12.0000 is inside: 0
 DEAL::10.0000 16.0000 is inside: 0
 DEAL::-12.5000 -20.0000 is inside: 0
+DEAL::Boxes should not be equal : 1
 DEAL::
 DEAL::
 DEAL::Test for dimension 3
@@ -61,12 +65,14 @@ DEAL::0.440000 0.640000 0.840000 is inside: 1
 DEAL::0.320000 0.320000 0.320000 is inside: 1
 DEAL::0.200000 0.00000 -0.200000 is inside: 1
 DEAL::
+DEAL::Boxes should be equal : 1
 DEAL::Points outside:
 DEAL::-2.50000 -4.00000 -5.50000 is inside: 0
 DEAL::5.00000 8.00000 11.0000 is inside: 0
 DEAL::-7.50000 -12.0000 -16.5000 is inside: 0
 DEAL::10.0000 16.0000 22.0000 is inside: 0
 DEAL::-12.5000 -20.0000 -27.5000 is inside: 0
+DEAL::Boxes should not be equal : 1
 DEAL::
 DEAL::
 DEAL::Test for dimension 3, unitary box

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.