OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
Average.hpp
1 /*
2  * Average.hpp
3  *
4  * Created on: Nov 18, 2015
5  * Author: Pietro Incardona
6  */
7 
8 #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_AVERAGE_HPP_
9 #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_AVERAGE_HPP_
10 
11 
12 #define CENTRAL 0
13 #define CENTRAL_B_ONE_SIDE 1
14 #define FORWARD 2
15 #define BACKWARD 3
16 
17 #include "util/mathutil.hpp"
18 #include "Vector/map_vector.hpp"
19 #include "Grid/comb.hpp"
20 #include "FiniteDifference/util/common.hpp"
21 #include "util/util_num.hpp"
22 
30 template<unsigned int d, typename Field, typename Sys_eqs, unsigned int impl=CENTRAL>
31 class Avg
32 {
38  inline static void value(const grid_key_dx<Sys_eqs::dims> & pos, const grid_sm<Sys_eqs::dims,void> & gs, std::unordered_map<long int,typename Sys_eqs::stype > & cols, typename Sys_eqs::stype coeff)
39  {
40  std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " only CENTRAL, FORWARD, BACKWARD derivative are defined";
41  }
42 
54  {
55  std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " only CENTRAL, FORWARD, BACKWARD derivative are defined";
56  }
57 };
58 
69 template<unsigned int d, typename arg, typename Sys_eqs>
70 class Avg<d,arg,Sys_eqs,CENTRAL>
71 {
72  public:
73 
90  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, 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)
91  {
92  // if the system is staggered the CENTRAL derivative is equivalent to a forward derivative
94  {
95  Avg<d,arg,Sys_eqs,BACKWARD>::value(g_map,kmap,gs,spacing,cols,coeff);
96  return;
97  }
98 
99  long int old_val = kmap.getKeyRef().get(d);
100  kmap.getKeyRef().set_d(d, kmap.getKeyRef().get(d) + 1);
101  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
102  kmap.getKeyRef().set_d(d,old_val);
103 
104 
105  old_val = kmap.getKeyRef().get(d);
106  kmap.getKeyRef().set_d(d, kmap.getKeyRef().get(d) - 1);
107  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
108  kmap.getKeyRef().set_d(d,old_val);
109  }
110 
111 
122  {
123  auto arg_pos = arg::position(pos,gs,s_pos);
125  {
126  if (arg_pos.get(d) == -1)
127  {
128  arg_pos.set_d(d,0);
129  return arg_pos;
130  }
131  else
132  {
133  arg_pos.set_d(d,-1);
134  return arg_pos;
135  }
136  }
137 
138  return arg_pos;
139  }
140 };
141 
152 template<unsigned int d, typename arg, typename Sys_eqs>
153 class Avg<d,arg,Sys_eqs,FORWARD>
154 {
155  public:
156 
173  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, 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)
174  {
175 
176  long int old_val = kmap.getKeyRef().get(d);
177  kmap.getKeyRef().set_d(d, kmap.getKeyRef().get(d) + 1);
178  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
179  kmap.getKeyRef().set_d(d,old_val);
180 
181  // backward
182  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
183  }
184 
185 
197  {
198  return arg::position(pos,gs,s_pos);
199  }
200 };
201 
212 template<unsigned int d, typename arg, typename Sys_eqs>
213 class Avg<d,arg,Sys_eqs,BACKWARD>
214 {
215  public:
216 
233  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, 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)
234  {
235  long int old_val = kmap.getKeyRef().get(d);
236  kmap.getKeyRef().set_d(d, kmap.getKeyRef().get(d) - 1);
237  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
238  kmap.getKeyRef().set_d(d,old_val);
239 
240  // forward
241  arg::value(g_map,kmap,gs,spacing,cols,coeff/2);
242  }
243 
244 
256  {
257  return arg::position(pos,gs,s_pos);
258  }
259 };
260 
261 #endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_AVERAGE_HPP_ */
grid_key_dx< dim > & getKeyRef()
Get the reference key.
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, 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: Average.hpp:233
static grid_key_dx< Sys_eqs::dims > position(grid_key_dx< Sys_eqs::dims > &pos, const grid_sm< Sys_eqs::dims, void > &gs, const openfpm::vector< comb< Sys_eqs::dims >> &s_pos=openfpm::vector< comb< Sys_eqs::dims >>())
Calculate the position where the derivative is calculated.
Definition: Average.hpp:53
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, 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: Average.hpp:173
Grid key for a distributed grid.
static void value(const grid_key_dx< Sys_eqs::dims > &pos, const grid_sm< Sys_eqs::dims, void > &gs, std::unordered_map< long int, typename Sys_eqs::stype > &cols, typename Sys_eqs::stype coeff)
Create the row of the Matrix.
Definition: Average.hpp:38
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 average is calculated.
Definition: Average.hpp:255
Average.
Definition: Average.hpp:31
is_grid_staggered analyse T if it has a property grid_type defined and indicate that the grid is stag...
Definition: common.hpp:42
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 where the average is calculated.
Definition: Average.hpp:121
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 average is calculated.
Definition: Average.hpp:196
Implementation of 1-D std::vector like structure.
Definition: map_vector.hpp:61
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, 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: Average.hpp:90