1 /*
2 * sum.hpp
3 *
4 * Created on: Oct 13, 2015
5 * Author: i-bird
6 */
7
8 #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_SUM_HPP_
9 #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_SUM_HPP_
10
11 #include <boost/mpl/vector.hpp>
12 #include "config.h"
13 #include <unordered_map>
14 #include "util/for_each_ref.hpp"
15
16 /*! \brief sum functor value
17 *
18 * \param v_expr vector expression
19 *
20 */
21 template<typename v_expr>
22 struct sum_functor_value
23 {
24 //! Number of elements in the vector v_expr
25 typedef boost::mpl::size<v_expr> size;
26
27 //! Last element of sum
28 typedef typename boost::mpl::at<v_expr,boost::mpl::int_<size::value-1> >::type last;
29
30 //! sum functor
31 std::unordered_map<long int,typename last::stype> & cols;
32
33 //! Grid info
34 const grid_sm<last::dims,void> & gs;
35
36 //! grid mapping
37 const typename stub_or_real<last,last::dims,typename last::stype,typename last::b_grid::decomposition::extended_type>::type & g_map;
38
39 //! grid position
40 grid_dist_key_dx<last::dims> & kmap;
41
42 //! coefficent
43 typename last::stype coeff;
44
45 //! spacing
46 typename last::stype (& spacing)[last::dims];
47
48
49 /*! \brief constructor
50 *
51 * \param g_map Grid mapping, it convert grid position into vector/Matrix row
52 * \param kmap grid position
53 * \param gs grid information
54 * \param spacing grid spacing
55 * \param cols unordered map contain the map colum -> value
56 * \param coeff it contain an additional actual coefficients in front of the values
57 *
58 */
59 sum_functor_value(const typename stub_or_real<last,last::dims,typename last::stype,typename last::b_grid::decomposition::extended_type>::type & g_map,
60 grid_dist_key_dx<last::dims> & kmap,
61 const grid_sm<last::dims,void> & gs,
62 typename last::stype (& spacing)[last::dims],
63 std::unordered_map<long int,typename last::stype> & cols,
64 typename last::stype coeff)
65 :cols(cols),gs(gs),g_map(g_map),kmap(kmap),coeff(coeff),spacing(spacing)
66 {};
67
68 /*! \brief It call this function for every expression operand in the sum
69 *
70 * \param t expression operand id
71 *
72 */
73 template<typename T>
74 void operator()(T& t) const
75 {
76 boost::mpl::at<v_expr, boost::mpl::int_<T::value> >::type::value(g_map,kmap,gs,spacing,cols,coeff);
77 }
78
79};
80
81/*! \brief It model an expression expr1 + ... exprn
82 *
83 * \tparam expr.. two or more expression to be summed
84 * \tparam Sys_eqs stystem specification
85 *
86 * ## Example
87 *
88 * \snippet FDScheme_unit_tests.hpp sum example
89 *
90 */
91template<typename ... expr>
92struct sum
93{
94 //! Transform from variadic template to boost mpl vector
95 typedef boost::mpl::vector<expr... > v_expr;
96
97 //! size of v_expr
98 typedef typename boost::mpl::size<v_expr>::type v_sz;
99
100 //! struct that specify the syste, of equations
101 typedef typename boost::mpl::at<v_expr, boost::mpl::int_<v_sz::type::value - 1> >::type Sys_eqs;
102
103 /*! \brief Calculate which colums of the Matrix are non zero
104 *
105 * \param g_map Grid mapping, it convert grid position into vector/Matrix row
106 * \param kmap grid position
107 * \param gs grid information
108 * \param spacing grid spacing
109 * \param cols unordered map contain the map colum -> value
110 * \param coeff it contain an additional actual coefficients in front of the values
111 *
112 * ### Example
113 *
114 * \snippet FDScheme_unit_tests.hpp sum example
115 *
116 */
117 inline static void value(const typename stub_or_real<Sys_eqs,Sys_eqs::dims,typename Sys_eqs::stype,typename Sys_eqs::b_grid::decomposition::extended_type>::type & g_map,
118 grid_dist_key_dx<Sys_eqs::dims> & kmap,
119 const grid_sm<Sys_eqs::dims,void> & gs,
120 typename Sys_eqs::stype (& spacing )[Sys_eqs::dims],
121 std::unordered_map<long int,typename Sys_eqs::stype > & cols,
122 typename Sys_eqs::stype coeff)
123 {
124 // Sum functor
125 sum_functor_value<v_expr> sm(g_map,kmap,gs,spacing,cols,coeff);
126
127 // for each element in the expression calculate the non-zero Matrix elements
128 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_sz::type::value - 1> >(sm);
129 }
130
131
132};
133
134/*! \brief It ancapsulate the minus operation
135 *
136 * \tparam arg
137 * \tparam Sys_eqs system of equation
138 *
139 */
140template<typename arg, typename Sys_eqs>
141struct minus
142{
143 /*! \brief Create the row of the Matrix
144 *
145 * \tparam ord
146 *
147 * \snippet FDScheme_unit_tests.hpp minus example
148 *
149 * \param g_map Grid mapping, it convert grid position into vector/Matrix row
150 * \param kmap grid position
151 * \param gs grid information
152 * \param spacing grid spacing
153 * \param cols unordered map contain the map colum -> value
154 * \param coeff it contain an additional actual coefficients in front of the values
155 *
156 */
157 inline static void value(const typename stub_or_real<Sys_eqs,Sys_eqs::dims,typename Sys_eqs::stype,typename Sys_eqs::b_grid::decomposition::extended_type>::type & g_map,
158 grid_dist_key_dx<Sys_eqs::dims> & kmap,
159 const grid_sm<Sys_eqs::dims,void> & gs,
160 typename Sys_eqs::stype (& spacing )[Sys_eqs::dims],
161 std::unordered_map<long int,typename Sys_eqs::stype > & cols,
162 typename Sys_eqs::stype coeff)
163 {
164 arg::value(g_map,kmap,gs,spacing,cols,-coeff);
165 }
166
167
168};
169
170#endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_SUM_HPP_ */
171