NiHu  2.0
fmm_precompute.hpp
Go to the documentation of this file.
1 
7 #ifndef NIHU_FMM_PRECOMPUTE_HPP_INCLUDED
8 #define NIHU_FMM_PRECOMPUTE_HPP_INCLUDED
9 
10 #include "cluster_tree.hpp"
11 #include "leaf_precompute.hpp"
12 #include "lists.hpp"
13 #include "p2p_precompute.hpp"
14 #include "x2x_precompute.hpp"
15 
16 #include <type_traits>
17 
18 namespace NiHu
19 {
20 namespace fmm
21 {
22 
23 template <class Op, class FmmTag = typename std::decay<Op>::type::fmm_tag>
24 class precompute;
25 
26 template <class Op>
27 class precompute<Op, m2l_tag>
28 {
29 public:
30  template <class ClusterDerived>
31  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
32  {
33  std::cout << "Precomputing M2L" << std::endl;
34  return create_x2x_precompute(std::forward<Op>(op), lists.get_list(lists.M2L));
35  }
36 };
37 
38 
39 template <class Op>
40 class precompute<Op, m2m_tag>
41 {
42 public:
43  template <class ClusterDerived>
44  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
45  {
46  std::cout << "Precomputing M2M" << std::endl;
47  return create_x2x_precompute(std::forward<Op>(op), lists.get_list(lists.M2M));
48  }
49 };
50 
51 
52 template <class Op>
53 class precompute<Op, l2l_tag>
54 {
55 public:
56  template <class ClusterDerived>
57  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
58  {
59  std::cout << "Precomputing L2L" << std::endl;
60  return create_x2x_precompute(std::forward<Op>(op), lists.get_list(lists.L2L));
61  }
62 };
63 
64 
65 template <class Op>
66 class precompute<Op, p2m_tag>
67 {
68 public:
69  template <class ClusterDerived>
70  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
71  {
72  std::cout << "Precomputing P2M" << std::endl;
73  return create_p2x_precompute(std::forward<Op>(op), tree);
74  }
75 };
76 
77 
78 template <class Op>
79 class precompute<Op, p2l_tag>
80 {
81 public:
82  template <class ClusterDerived>
83  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
84  {
85  std::cout << "Precomputing P2L" << std::endl;
86  return create_p2x_precompute(std::forward<Op>(op), tree, lists.get_list(lists.P2L));
87  }
88 };
89 
90 
91 template <class Op>
92 class precompute<Op, m2p_tag>
93 {
94 public:
95  template <class ClusterDerived>
96  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
97  {
98  std::cout << "Precomputing M2M" << std::endl;
99  return create_x2p_precompute(std::forward<Op>(op), tree, lists.get_list(lists.M2P));
100  }
101 };
102 
103 
104 template <class Op>
105 class precompute<Op, l2p_tag>
106 {
107 public:
108  template <class ClusterDerived>
109  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
110  {
111  std::cout << "Precomputing L2P" << std::endl;
112  return create_x2p_precompute(std::forward<Op>(op), tree);
113  }
114 };
115 
116 
117 template <class Op>
118 class precompute<Op, p2p_tag>
119 {
120 public:
121  template <class ClusterDerived>
122  static auto eval(Op &&op, cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
123  {
124  std::cout << "Precomputing P2P" << std::endl;
125  return create_p2p_precompute(std::forward<Op>(op), tree, lists.get_list(lists.P2P));
126  }
127 };
128 
129 
130 template <class Op, class Tree>
131 auto create_precompute(Op &&op, Tree const &tree, interaction_lists const &lists)
132 {
133  return precompute<Op>::eval(std::forward<Op>(op), tree, lists);
134 }
135 
136 template <class ClusterDerived>
138 {
140  : m_tree(tree)
141  , m_lists(lists)
142  {
143  }
144 
145  template <class Op>
146  auto operator()(Op &&op) const
147  {
148  return create_precompute(std::forward<Op>(op), m_tree, m_lists);
149  }
150 
151  cluster_tree<ClusterDerived> const &m_tree;
152  interaction_lists const &m_lists;
153 };
154 
155 template <class ClusterDerived>
156 auto create_precompute_functor(cluster_tree<ClusterDerived> const &tree, interaction_lists const &lists)
157 {
158  return precompute_functor<ClusterDerived>(tree, lists);
159 }
160 
161 } // end of namespace fmm
162 } // end of namespace NiHu
163 
164 #endif /* NIHU_FMM_PRECOMPUTE_HPP_INCLUDED */
NiHu::fmm::op_tags::m2l
Definition: fmm_operator.hpp:22
NiHu::fmm::op_tags::l2p
Definition: fmm_operator.hpp:26
NiHu::fmm::precompute
Definition: fmm_precompute.hpp:24
leaf_precompute.hpp
Precomputation of P2M, P2L, M2P, L2P operators.
NiHu::fmm::op_tags::p2l
Definition: fmm_operator.hpp:25
NiHu::fmm::precompute_functor
Definition: fmm_precompute.hpp:137
NiHu::fmm::op_tags::l2l
Definition: fmm_operator.hpp:21
NiHu::fmm::interaction_lists::get_list
const list_t & get_list(size_t idx) const
return a selected list
Definition: lists.hpp:61
NiHu::fmm::cluster_tree
Class representing a cluster tree.
Definition: cluster_tree.hpp:33
NiHu::fmm::op_tags::p2m
Definition: fmm_operator.hpp:24
NiHu::fmm::op_tags::m2m
Definition: fmm_operator.hpp:20
cluster_tree.hpp
Implementation of class NiHu::fmm::cluster_tree.
lists.hpp
Definition of class NiHu::fmm::interaction_lists.
NiHu::fmm::op_tags::p2p
Definition: fmm_operator.hpp:29
p2p_precompute.hpp
Pre-computation of P2P operators for acceleration.
NiHu::fmm::create_p2p_precompute
auto create_p2p_precompute(Operator &&op, cluster_tree< ClusterDerived > const &tree, interaction_lists::list_t const &list)
Create function for a precomputed P2P operator.
Definition: p2p_precompute.hpp:339
x2x_precompute.hpp
Implementation of class template NiHu::fmm::x2x_precompute.
NiHu::fmm::interaction_lists
class storing the different interaction lists of a tree
Definition: lists.hpp:22
NiHu::fmm::op_tags::m2p
Definition: fmm_operator.hpp:27