OpenFPM_pdata  4.1.0
Project that contain the implementation of distributed structures
 
Loading...
Searching...
No Matches
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
19template <unsigned int, typename T>
20struct 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
31template <typename T>
32struct has_val<HAS_VAL,T>
33{
35 static decltype(T::val()) call_val()
36 {
37 return T::val();
38 }
39};
40
42template<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)
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
118template<typename ... expr >
119struct 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,
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
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_ */
This is a distributed grid.
Grid key for a distributed grid.
grid_key_dx is the key to access any element in the grid
Definition grid_key.hpp:19
Declaration grid_sm.
Definition grid_sm.hpp:167
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Position of the element of dimension d in the hyper-cube of dimension dim.
Definition comb.hpp:35
Multiplication expression.
Definition mul.hpp:44
grid_dist_key_dx< last::dims > & kmap
grid position
Definition mul.hpp:61
boost::mpl::at< v_expr, boost::mpl::int_< size::value-1 > >::type last
Last element of sum.
Definition mul.hpp:49
boost::mpl::size< v_expr > size
Number of elements in the vector v_expr.
Definition mul.hpp:46
const grid_sm< last::dims, void > & gs
grid size
Definition mul.hpp:55
void operator()(T &t)
It call this function for every constant expression in the mul.
Definition mul.hpp:92
last::stype getCoeff()
Get the coefficent.
Definition mul.hpp:104
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(& spacing)[last::dims]
spacing
Definition mul.hpp:67
last::stype coeff
coefficent
Definition mul.hpp:64
std::unordered_map< long int, typename last::stype > & cols
sum functor
Definition mul.hpp:52
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
static decltype(T::val()) call_val()
evaluate
Definition mul.hpp:35
Evaluate the constant field function.
Definition mul.hpp:21
static float call_val()
evaluate
Definition mul.hpp:23
It model an expression expr1 * expr2.
Definition mul.hpp:120
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
boost::mpl::vector< expr... > v_expr
Transform from variadic template to boost mpl vector.
Definition mul.hpp:122
boost::mpl::size< v_expr >::type v_sz
size of v_expr
Definition mul.hpp:125
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 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