From: Luca Heltai Date: Thu, 14 Sep 2017 17:54:25 +0000 (+0200) Subject: KDTree support. X-Git-Tag: v9.0.0-rc1~1052^2~7 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=16bc8635e868d6c50d40d1d0060194d2422d72e7;p=dealii.git KDTree support. --- diff --git a/include/deal.II/grid/tria_info_cache.h b/include/deal.II/grid/tria_info_cache.h index 5ef199d1f8..56c0fac185 100644 --- a/include/deal.II/grid/tria_info_cache.h +++ b/include/deal.II/grid/tria_info_cache.h @@ -28,6 +28,8 @@ #include #include +#include + #include DEAL_II_NAMESPACE_OPEN @@ -103,6 +105,14 @@ public: const std::vector>> &get_vertex_to_cell_centers_directions() const; +#ifdef DEAL_II_WITH_NANOFLANN + /** + * Return the cached vertex_kdtree object, constructed with the vertices of + * the stored triangulation. + */ + const KDTree &get_vertex_kdtree() const; +#endif + /** * Exception for uninitialized cache fields. */ @@ -117,7 +127,7 @@ private: /** * A pointer to the Triangulation. */ - SmartPointer, + SmartPointer, TriangulationInfoCache> tria; /** @@ -128,7 +138,7 @@ private: /** * Mapping to use when computing on the Triangulation. */ - SmartPointer, + SmartPointer, TriangulationInfoCache> mapping; @@ -143,6 +153,13 @@ private: * GridTools::vertex_to_cell_centers_directions. */ std::vector>> vertex_to_cell_centers; + +#ifdef DEAL_II_WITH_NANOFLANN + /** + * A KDTree object constructed with the vertices of the triangulation. + */ + KDTree vertex_kdtree; +#endif }; DEAL_II_NAMESPACE_CLOSE diff --git a/include/deal.II/grid/tria_info_cache_flags.h b/include/deal.II/grid/tria_info_cache_flags.h index 165d735c68..0c8a4202e0 100644 --- a/include/deal.II/grid/tria_info_cache_flags.h +++ b/include/deal.II/grid/tria_info_cache_flags.h @@ -47,6 +47,13 @@ enum TriangulationInfoCacheFlags * GridTools::vertex_to_cell_centers_directions() */ cache_vertex_to_cell_centers_directions = cache_vertex_to_cell_map | 0x0002, + +#ifdef DEAL_II_WITH_NANOFLANN + /** + * Cache a KDTree object, initialized with the vertices of the Triangulation. + */ + cache_vertex_kdtree = 0x0004, +#endif }; @@ -62,6 +69,9 @@ StreamType &operator << (StreamType &s, TriangulationInfoCacheFlags u) s << " TriangulationInfoCacheFlags"; if (u & cache_vertex_to_cell_map) s << "|vertex_to_cell_map"; if (u & cache_vertex_to_cell_centers_directions) s << "|vertex_to_cells_centers_directions"; +#ifdef DEAL_II_WITH_NANOFLANN + if (u & cache_vertex_kdtree) s << "|vertex_kdtree"; +#endif return s; } diff --git a/source/grid/tria_info_cache.cc b/source/grid/tria_info_cache.cc index dc975f59af..b68aab102f 100644 --- a/source/grid/tria_info_cache.cc +++ b/source/grid/tria_info_cache.cc @@ -45,6 +45,11 @@ void TriangulationInfoCache::update(bool topology_is_unchanged) { if (cache_vertex_to_cell_map & flags) vertex_to_cells = GridTools::vertex_to_cell_map(*tria); + +#ifdef DEAL_II_WITH_NANOFLANN + if (cache_vertex_kdtree & flags) + vertex_kdtree.set_points(tria->get_vertices()); +#endif } if (cache_vertex_to_cell_centers_directions & flags) @@ -74,4 +79,19 @@ TriangulationInfoCache::get_vertex_to_cell_centers_directions() co return vertex_to_cell_centers; } + + +#ifdef DEAL_II_WITH_NANOFLANN +template +const KDTree &TriangulationInfoCache::get_vertex_kdtree() const +{ + Assert(flags & cache_vertex_kdtree, + ExcAccessToInvalidCacheObject(cache_vertex_kdtree, flags)); + return vertex_kdtree; +} +#endif + +#include "tria_info_cache.inst" + DEAL_II_NAMESPACE_CLOSE +