[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);