NiHu  2.0
tree_building.cpp
1 #include "fmm/cluster_tree.hpp"
3 #include "fmm/empty_cluster.hpp"
4 #include "fmm/divide.hpp"
7 
8 #include <iostream>
9 
11 static size_t const dimension = 3;
15 
17 void dfs(cluster_tree_t const &tree, size_t idx)
18 {
19  for (auto c : tree[idx].get_children())
20  dfs(tree, c);
21 }
23 
24 
25 
26 int main()
27 {
29  typedef cluster_t::location_t location_t;
30  size_t N = 5000; // number of nodes
31  location_t *begin = new location_t[N];
32  for (size_t i = 0; i < N; ++i)
33  begin[i].setRandom();
35 
37  cluster_tree_t tree(begin, begin + N, NiHu::fmm::divide_num_nodes(10));
39 
41  cluster_tree_t tree_depth(begin, begin + N, NiHu::fmm::divide_depth(6));
42  cluster_tree_t tree_diam(begin, begin + N, NiHu::fmm::divide_diameter(1e-1));
44 
45 
47  size_t N_src = 1000;
48  location_t *src_begin = new location_t[N_src];
49  for (size_t i = 0; i < N_src; ++i)
50  src_begin[i].setRandom();
51 
52  size_t N_rec = 200;
53  location_t *rec_begin = new location_t[N_rec];
54  for (size_t i = 0; i < N_rec; ++i)
55  rec_begin[i].setRandom();
56 
57  cluster_tree_t src_rec_tree(src_begin, src_begin + N_src,
58  rec_begin, rec_begin + N_rec,
61 
63  auto mesh = NiHu::read_off_mesh("mesh.off", NiHu::tria_1_tag());
64  cluster_tree_t tree_mesh(
65  NiHu::fmm::create_elem_center_iterator(mesh.template begin<NiHu::tria_1_elem>()),
66  NiHu::fmm::create_elem_center_iterator(mesh.template end<NiHu::tria_1_elem>()),
69 
71  for (size_t i = 0; i < tree.get_n_clusters(); ++i)
72  {
73  size_t level = tree[i].get_level();
74  location_t loc = tree[i].get_bounding_box().get_center();
75  }
77 
79  for (size_t i = tree.level_begin(2); i < tree.level_end(2); ++i)
80  cluster_t const &c = tree[i];
82 
84  for (auto i : tree.get_leaf_src_indices())
85  cluster_t const &c = tree[i];
87 
89  for (auto i : tree.get_leaf_src_indices())
90  cluster_t const &c = tree[i];
92 
93  delete[] begin;
94  delete[] src_begin;
95  delete[] rec_begin;
96 
97  return 0;
98 }
NiHu::type2tag
Metafunction assigning a tag to a type.
Definition: type2tag.hpp:17
NiHu::read_off_mesh
mesh< tmp::vector< typename tag2type< Tags >::type... > > read_off_mesh(std::string const &fname, Tags...tags)
Read mesh from OFF format.
Definition: read_off_mesh.hpp:153
NiHu::fmm::cluster_tree::get_n_clusters
size_t get_n_clusters() const
return number of clusters
Definition: cluster_tree.hpp:282
NiHu::fmm::chebyshev_cluster
Cluster class of the Black Box FMM.
Definition: chebyshev_cluster.hpp:28
NiHu::fmm::empty_cluster
Empty cluster class.
Definition: empty_cluster.hpp:18
NiHu::fmm::divide_diameter
class representing a balanced tree division predicate by leaf diameter
Definition: divide.hpp:102
NiHu::fmm::divide_depth
Class representing a balanced tree division predicate.
Definition: divide.hpp:41
NiHu::fmm::cluster_tree< cluster_t >
NiHu::fmm::divide_num_nodes
Class representing a cluster division based on number of nodes.
Definition: divide.hpp:74
empty_cluster.hpp
Definition of the class empty_cluster.
cluster_tree.hpp
Implementation of class NiHu::fmm::cluster_tree.
read_off_mesh.hpp
export NiHu mesh from OFF format
NiHu::fmm::cluster_tree::level_begin
size_t level_begin(size_t idx) const
Begin iterator to idx-th level clusters.
Definition: cluster_tree.hpp:264
divide.hpp
Cluster division strategies.
NiHu::fmm::cluster_tree::level_end
size_t level_end(size_t idx) const
End iterator to idx-th level clusters.
Definition: cluster_tree.hpp:274
lib_element.hpp
elem_center_iterator.hpp
Classes for iterating through elements and fields.