getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] (no subject)


From: Markus Bürg
Subject: [Getfem-commits] (no subject)
Date: Mon, 3 Jun 2019 11:40:11 -0400 (EDT)

branch: mb-Use_rtree_in_poly_composite
commit 00c15b2c8e8aca1163cc4e25abbfc541cc16cc3b
Author: mb <address@hidden>
Date:   Mon May 27 13:26:42 2019 +0200

    Have to loop over all convexes associated with a box.
---
 src/getfem/getfem_interpolated_fem.h |  1 +
 src/getfem_interpolated_fem.cc       | 21 +++++++++++----------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/getfem/getfem_interpolated_fem.h 
b/src/getfem/getfem_interpolated_fem.h
index e7d1dad..f83c880 100644
--- a/src/getfem/getfem_interpolated_fem.h
+++ b/src/getfem/getfem_interpolated_fem.h
@@ -107,6 +107,7 @@ namespace getfem {
     mutable std::vector<elt_interpolation_data> elements;
     mutable bgeot::rtree boxtree; // Tree containing the bounding box
                                   // of mf1 elements
+    mutable std::map<size_type, std::vector<size_type>> box_to_convexes_map;
     mutable std::vector<size_type> ind_dof; /* all functions using this work
                                                array should keep it full of
                                                size_type(-1) */
diff --git a/src/getfem_interpolated_fem.cc b/src/getfem_interpolated_fem.cc
index 42614d1..7a3256e 100644
--- a/src/getfem_interpolated_fem.cc
+++ b/src/getfem_interpolated_fem.cc
@@ -25,13 +25,12 @@ namespace getfem {
 
   void interpolated_fem::build_rtree(void) const {
     base_node min, max;
-    scalar_type EPS=1E-13;
     boxtree.clear();
+    box_to_convexes_map.clear();
     for (dal::bv_visitor cv(mf.convex_index()); !cv.finished(); ++cv) {
       bounding_box(min, max, mf.linked_mesh().points_of_convex(cv),
                    mf.linked_mesh().trans_of_convex(cv));
-      for (unsigned k=0; k < min.size(); ++k) { min[k]-=EPS; max[k]+=EPS; }
-      boxtree.add_box(min, max, cv);
+      box_to_convexes_map[boxtree.add_box(min, max, cv)].push_back(cv);
     }
     boxtree.build_tree();
   }
@@ -46,12 +45,14 @@ namespace getfem {
     bgeot::rtree::pbox_set::const_iterator it = boxlst.begin(),
       ite = boxlst.end();
     for (; it != ite; ++it) {
-      gic = bgeot::geotrans_inv_convex
-        (mf.linked_mesh().convex((*it)->id),
-         mf.linked_mesh().trans_of_convex((*it)->id));
-      cv_stored = (*it)->id;
-      if (gic.invert(pt, ptr, gt_invertible)) {
-        cv = (*it)->id; return true;
+      for (auto candidate : box_to_convexes_map.at((*it)->id)) {
+        gic = bgeot::geotrans_inv_convex
+          (mf.linked_mesh().convex(candidate),
+           mf.linked_mesh().trans_of_convex(candidate));
+        cv_stored = candidate;
+        if (gic.invert(pt, ptr, gt_invertible)) {
+          cv = candidate; return true;
+        }
       }
     }
     return false;
@@ -377,7 +378,7 @@ namespace getfem {
                                      dal::bit_vector blocked_dof_,
                                      bool store_val)
     : mf(mef), mim(meim), pif(pif_), store_values(store_val),
-      blocked_dof(blocked_dof_), mi2(2), mi3(3) {
+      blocked_dof(blocked_dof_), boxtree{1E-13}, mi2(2), mi3(3) {
     DAL_STORED_OBJECT_DEBUG_CREATED(this, "Interpolated fem");
     this->add_dependency(mf);
     this->add_dependency(mim);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]