DOLFINx
DOLFINx C++ interface
BoundingBoxTree.h
1// Copyright (C) 2013 Anders Logg
2//
3// This file is part of DOLFINx (https://www.fenicsproject.org)
4//
5// SPDX-License-Identifier: LGPL-3.0-or-later
6
7#pragma once
8
9#include <array>
10#include <mpi.h>
11#include <vector>
12#include <xtensor/xfixed.hpp>
13#include <xtl/xspan.hpp>
14
15namespace dolfinx::mesh
16{
17class Mesh;
18}
19
21{
22
25
27{
28
29public:
38 BoundingBoxTree(const mesh::Mesh& mesh, int tdim,
39 const xtl::span<const std::int32_t>& entities,
40 double padding = 0);
41
48 BoundingBoxTree(const mesh::Mesh& mesh, int tdim, double padding = 0);
49
53 std::vector<std::pair<std::array<double, 3>, std::int32_t>> points);
54
57
59 BoundingBoxTree(const BoundingBoxTree& tree) = delete;
60
63
65 BoundingBoxTree& operator=(const BoundingBoxTree& other) = default;
66
68 ~BoundingBoxTree() = default;
69
74 xt::xtensor_fixed<double, xt::xshape<2, 3>> get_bbox(std::size_t node) const;
75
81 BoundingBoxTree create_global_tree(MPI_Comm comm) const;
82
84 std::int32_t num_bboxes() const;
85
87 int tdim() const;
88
90 std::string str() const;
91
99 std::array<int, 2> bbox(std::size_t node) const
100 {
101 assert(2 * node + 1 < _bboxes.size());
102 return {_bboxes[2 * node], _bboxes[2 * node + 1]};
103 }
104
105private:
106 // Constructor
107 BoundingBoxTree(std::vector<std::int32_t>&& bboxes,
108 std::vector<double>&& bbox_coords);
109
110 // Topological dimension of leaf entities
111 int _tdim;
112
113 // Print out recursively, for debugging
114 void tree_print(std::stringstream& s, int i) const;
115
116 // List of bounding boxes (parent-child-entity relations)
117 std::vector<std::int32_t> _bboxes;
118
119 // List of bounding box coordinates
120 std::vector<double> _bbox_coordinates;
121};
122} // namespace dolfinx::geometry
Axis-Aligned bounding box binary tree. It is used to find entities in a collection (often a mesh::Mes...
Definition: BoundingBoxTree.h:27
BoundingBoxTree & operator=(const BoundingBoxTree &other)=default
Copy assignment.
BoundingBoxTree(const mesh::Mesh &mesh, int tdim, const xtl::span< const std::int32_t > &entities, double padding=0)
Constructor.
Definition: BoundingBoxTree.cpp:232
BoundingBoxTree & operator=(BoundingBoxTree &&other)=default
Move assignment.
BoundingBoxTree create_global_tree(MPI_Comm comm) const
Compute a global bounding tree (collective on comm) This can be used to find which process a point mi...
Definition: BoundingBoxTree.cpp:299
int tdim() const
Topological dimension of leaf entities.
Definition: BoundingBoxTree.cpp:342
BoundingBoxTree(BoundingBoxTree &&tree)=default
Move constructor.
std::int32_t num_bboxes() const
Return number of bounding boxes.
Definition: BoundingBoxTree.cpp:333
xt::xtensor_fixed< double, xt::xshape< 2, 3 > > get_bbox(std::size_t node) const
Return bounding box coordinates for a given node in the tree.
Definition: BoundingBoxTree.cpp:370
BoundingBoxTree(const BoundingBoxTree &tree)=delete
Copy constructor.
~BoundingBoxTree()=default
Destructor.
std::string str() const
Print out for debugging.
Definition: BoundingBoxTree.cpp:335
std::array< int, 2 > bbox(std::size_t node) const
Get bounding box child nodes.
Definition: BoundingBoxTree.h:99
A Mesh consists of a set of connected and numbered mesh topological entities, and geometry data.
Definition: Mesh.h:33
Geometry data structures and algorithms.
Definition: BoundingBoxTree.h:21
Mesh data structures and algorithms on meshes.
Definition: DofMap.h:30