OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
mul.hpp
1 /*
2  * mul.hpp
3  *
4  * Created on: Oct 22, 2015
5  * Author: i-bird
6  */
7 
8 #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_MUL_HPP_
9 #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_MUL_HPP_
10 
11 #include <typeinfo>
12 #include "util/util_debug.hpp"
13 #include "util/util_num.hpp"
14 
15 #define HAS_VAL 1
16 #define HAS_POS_VAL 2
17 
19 template <unsigned int, typename T>
20 struct has_val
21 {
23  static float call_val()
24  {
25  std::cerr << "Error the type " << demangle(typeid(T).name()) << "interpreted as constant field, does not have a function val() or val_pos(), please see the numeric examples in Finite Differences for more information\n";
26  return 0;
27  }
28 };
29 
31 template <typename T>
32 struct has_val<HAS_VAL,T>
33 {
35  static decltype(T::val()) call_val()
36  {
37  return T::val();
38  }
39 };
40 
42 template<typename v_expr>
44 {
46  typedef boost::mpl::size<v_expr> size;
47 
49  typedef typename boost::mpl::at<v_expr,boost::mpl::int_<size::value-1> >::type last;
50 
52  std::unordered_map<long int,typename last::stype> & cols;
53 
56 
58  const grid_dist_id<last::dims,typename last::stype,aggregate<size_t>,typename last::b_grid::decomposition::extended_type> & g_map;
59 
62 
64  typename last::stype coeff;
65 
67  typename last::stype (& spacing)[last::dims];
68 
79  const_mul_functor_value(const grid_dist_id<last::dims,typename last::stype,aggregate<size_t>,typename last::b_grid::decomposition::extended_type> & g_map,
82  typename last::stype (& spacing)[last::dims],
83  std::unordered_map<long int,typename last::stype> & cols,
84  typename last::stype coeff)
85  :cols(cols),gs(gs),g_map(g_map),kmap(kmap),coeff(coeff),spacing(spacing)
86  {};
87 
88 
89 
91  template<typename T>
92  void operator()(T& t)
93  {
94  typedef typename boost::mpl::at<v_expr, boost::mpl::int_<T::value> >::type cfield;
95 
96  coeff *= has_val<is_const_field<cfield>::value * 1,cfield>::call_val();
97  }
98 
104  typename last::stype getCoeff()
105  {
106  return coeff;
107  }
108 };
109 
118 template<typename ... expr >
119 struct mul
120 {
122  typedef boost::mpl::vector<expr... > v_expr;
123 
125  typedef typename boost::mpl::size<v_expr>::type v_sz;
126 
128  typedef typename boost::mpl::at<v_expr, boost::mpl::int_<v_sz::type::value - 1> >::type Sys_eqs;
129 
140  inline static void value(const grid_dist_id<Sys_eqs::dims,typename Sys_eqs::stype,aggregate<size_t>,typename Sys_eqs::b_grid::decomposition::extended_type> & g_map,
142  const grid_sm<Sys_eqs::dims,void> & gs,
143  typename Sys_eqs::stype (& spacing )[Sys_eqs::dims],
144  std::unordered_map<long int,typename Sys_eqs::stype > & cols,
145  typename Sys_eqs::stype coeff)
146  {
147  const_mul_functor_value<v_expr> mfv(g_map,kmap,gs,spacing,cols,coeff);
148 
149  //
150  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_sz::type::value - 2> >(mfv);
151 
153  typedef typename boost::mpl::at< v_expr ,boost::mpl::int_<v_sz::value-2> >::type last_m;
154 
155  last_m::value(g_map,kmap,gs,spacing,cols,mfv.coeff);
156  }
157 
168  const grid_sm<Sys_eqs::dims,void> & gs,
169  const comb<Sys_eqs::dims> (& s_pos)[Sys_eqs::nvar])
170  {
171  return boost::mpl::at<v_expr, boost::mpl::int_<v_sz::type::value - 2> >::type::position(pos,gs,s_pos);
172  }
173 };
174 
175 
176 #endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_MUL_HPP_ */
std::unordered_map< long int, typename last::stype > & cols
sum functor
Definition: mul.hpp:52
static grid_key_dx< Sys_eqs::dims > position(grid_key_dx< Sys_eqs::dims > &pos, const grid_sm< Sys_eqs::dims, void > &gs, const comb< Sys_eqs::dims >(&s_pos)[Sys_eqs::nvar])
Calculate the position in the cell where the mul operator is performed.
Definition: mul.hpp:167
Evaluate the constant field function.
Definition: mul.hpp:20
boost::mpl::size< v_expr >::type v_sz
size of v_expr
Definition: mul.hpp:125
boost::mpl::at< v_expr, boost::mpl::int_< v_sz::type::value-1 > >::type Sys_eqs
type on which this expression operate
Definition: mul.hpp:128
const grid_dist_id< last::dims, typename last::stype, aggregate< size_t >, typename last::b_grid::decomposition::extended_type > & g_map
grid mapping
Definition: mul.hpp:58
boost::mpl::size< v_expr > size
Number of elements in the vector v_expr.
Definition: mul.hpp:46
boost::mpl::vector< expr... > v_expr
Transform from variadic template to boost mpl vector.
Definition: mul.hpp:122
last::stype coeff
coefficent
Definition: mul.hpp:64
const grid_sm< last::dims, void > & gs
grid size
Definition: mul.hpp:55
It model an expression expr1 * expr2.
Definition: mul.hpp:119
This is a distributed grid.
void operator()(T &t)
It call this function for every constant expression in the mul.
Definition: mul.hpp:92
grid_dist_key_dx< last::dims > & kmap
grid position
Definition: mul.hpp:61
static void value(const grid_dist_id< Sys_eqs::dims, typename Sys_eqs::stype, aggregate< size_t >, typename Sys_eqs::b_grid::decomposition::extended_type > &g_map, grid_dist_key_dx< Sys_eqs::dims > &kmap, const grid_sm< Sys_eqs::dims, void > &gs, typename Sys_eqs::stype(&spacing)[Sys_eqs::dims], std::unordered_map< long int, typename Sys_eqs::stype > &cols, typename Sys_eqs::stype coeff)
Calculate which colums of the Matrix are non zero.
Definition: mul.hpp:140
static float call_val()
evaluate
Definition: mul.hpp:23
const_mul_functor_value(const grid_dist_id< last::dims, typename last::stype, aggregate< size_t >, typename last::b_grid::decomposition::extended_type > &g_map, grid_dist_key_dx< last::dims > &kmap, const grid_sm< last::dims, void > &gs, typename last::stype(&spacing)[last::dims], std::unordered_map< long int, typename last::stype > &cols, typename last::stype coeff)
constructor
Definition: mul.hpp:79
last::stype getCoeff()
Get the coefficent.
Definition: mul.hpp:104
boost::mpl::at< v_expr, boost::mpl::int_< size::value-1 > >::type last
Last element of sum.
Definition: mul.hpp:49
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Definition: aggregate.hpp:81
last::stype(& spacing)[last::dims]
spacing
Definition: mul.hpp:67
Multiplication expression.
Definition: mul.hpp:43