NiHu  2.0
p2p_indexed.hpp
1 #ifndef P2P_INDEXED_HPP_INCLUDED
2 #define P2P_INDEXED_HPP_INCLUDED
3 
4 #include "fmm_operator.hpp"
5 #include "local_operator.hpp"
6 #include "util/matrix_traits.hpp"
7 
8 #include <type_traits>
9 
10 namespace NiHu
11 {
12 namespace fmm
13 {
14 
15 template <class Operator, class TestIt, class TrialIt>
17  : public fmm_operator<p2p_tag>
18 {
19 public:
20  typedef typename std::decay<Operator>::type operator_t;
21  typedef TestIt test_iterator_t;
22  typedef TrialIt trial_iterator_t;
23 
24  typedef size_t test_input_t;
25  typedef size_t trial_input_t;
26  typedef typename operator_t::result_t result_t;
27 
28  static size_t const num_dof_per_src = num_cols<result_t>::value;
29  static size_t const num_dof_per_rec = num_rows<result_t>::value;
30 
31  p2p_indexed(Operator &&op, TestIt test_begin, TestIt test_end,
32  TrialIt trial_begin, TrialIt trial_end)
33  : m_op(std::forward<Operator>(op))
34  , m_test_begin(test_begin)
35  , m_test_end(test_end)
36  , m_trial_begin(trial_begin)
37  , m_trial_end(trial_end)
38  {
39  }
40 
41  result_t operator()(size_t test_idx, size_t trial_idx) const
42  {
43  return m_op(m_test_begin[test_idx], m_trial_begin[trial_idx]);
44  }
45 
46  size_t num_rec() const
47  {
48  return m_test_end - m_test_begin;
49  }
50 
51  size_t num_src() const
52  {
53  return m_trial_end - m_trial_begin;
54  }
55 
56 private:
57  Operator m_op;
58  test_iterator_t m_test_begin;
59  test_iterator_t m_test_end;
60  trial_iterator_t m_trial_begin;
61  trial_iterator_t m_trial_end;
62 };
63 
64 template <class Operator, class TestIt, class TrialIt>
65 struct is_local_operator<p2p_indexed<Operator, TestIt, TrialIt> >
66  : public is_local_operator<typename std::decay<Operator>::type> {};
67 
68 
69 template <class Operator, class TestIt, class TrialIt>
70 auto create_p2p_indexed(Operator &&op, TestIt test_begin, TestIt test_end,
71  TrialIt trial_begin, TrialIt trial_end)
72 {
74  std::forward<Operator>(op),
75  test_begin, test_end,
76  trial_begin, trial_end);
77 }
78 
79 } // end of namespace fmm
80 } // namespace NiHu
81 
82 #endif // P2P_INDEXED_HPP_INCLUDED
NiHu::fmm::is_local_operator
Metafunction to tell if an operator is local.
Definition: local_operator.hpp:25
fmm_operator.hpp
FMM operator types and tags.
NiHu::num_rows
metafunction returning the number of compile time rows
Definition: matrix_traits.hpp:16
NiHu::fmm::fmm_operator
Operator defining its tag type.
Definition: fmm_operator.hpp:85
local_operator.hpp
Interface of local operator.
NiHu::fmm::p2p_indexed
Definition: p2p_indexed.hpp:16
NiHu::num_cols
metafunction returning the number of compile time columns
Definition: matrix_traits.hpp:41
matrix_traits.hpp
compile time properties of matrices