OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
vector_dist_performance_common.hpp
1 /*
2  * vector_dist_performance_common.hpp
3  *
4  * Created on: Dec 25, 2016
5  * Author: i-bird
6  */
7 
8 #ifndef SRC_VECTOR_PERFORMANCE_VECTOR_DIST_PERFORMANCE_COMMON_HPP_
9 #define SRC_VECTOR_PERFORMANCE_VECTOR_DIST_PERFORMANCE_COMMON_HPP_
10 
11 #include "Vector/vector_dist.hpp"
12 
19 template<unsigned int dim, size_t prp = 0, typename T, typename V> void calc_forces(T & NN, V & vd, float r_cut)
20 {
21  auto it_v = vd.getDomainIterator();
22 
23  float sum[dim];
24 
25  for (size_t i = 0; i < dim; i++)
26  sum[i] = 0;
27 
28  while (it_v.isNext())
29  {
30  //key
31  vect_dist_key_dx key = it_v.get();
32 
33  // Get the position of the particles
34  Point<dim,float> p = vd.getPos(key);
35 
36  for (size_t i = 0; i < dim; i++)
37  sum[i] = 0;
38 
39  // Get the neighborhood of the particle
40  auto cell_it = NN.template getNNIterator<NO_CHECK>(NN.getCell(p));
41 
42  while(cell_it.isNext())
43  {
44  auto nnp = cell_it.get();
45 
46  // p != q
47  if (nnp == key.getKey())
48  {
49  ++cell_it;
50  continue;
51  }
52 
53  Point<dim,float> q = vd.getPos(nnp);
54 
55  if (p.distance2(q) < r_cut*r_cut)
56  {
57  //Calculate the forces
58  float num[dim];
59  for (size_t i = 0; i < dim; i++)
60  num[i] = vd.getPos(key)[i] - vd.getPos(nnp)[i];
61 
62  float denom = 0;
63  for (size_t i = 0; i < dim; i++)
64  denom += num[i] * num[i];
65 
66  float res[dim];
67  for (size_t i = 0; i < dim; i++)
68  res[i] = num[i] / denom;
69 
70  for (size_t i = 0; i < dim; i++)
71  sum[i] += res[i];
72  }
73  //Next particle in a cell
74  ++cell_it;
75  }
76 
77  //Put the forces
78  for (size_t i = 0; i < dim; i++)
79  vd.template getProp<prp>(key)[i] += sum[i];
80 
81  //Next particle in cell list
82  ++it_v;
83  }
84 }
85 
97 template<unsigned int dim, unsigned int prp, typename T, typename V> void cross_calc(T & NN, T & NN2, V & vd, V & vd2)
98 {
99  auto it_v = vd.getDomainIterator();
100 
101  while (it_v.isNext())
102  {
103  //key
104  vect_dist_key_dx key = it_v.get();
105 
106  // Get the position of the particles
107  Point<dim,float> p = vd.getPos(key);
108 
109  // Get the neighborhood of the particle
110  auto cell_it = NN2.template getNNIterator<NO_CHECK>(NN2.getCell(p));
111 
112  double sum = 0.0;
113 
114  while(cell_it.isNext())
115  {
116  auto nnp = cell_it.get();
117 
118  Point<dim,float> q = vd2.getPos(nnp);
119 
120  sum += norm(p - q);
121 
122  //Next particle in a cell
123  ++cell_it;
124  }
125 
126  vd.template getProp<prp>(key) = sum;
127 
128  //Next particle in cell list
129  ++it_v;
130  }
131 }
132 
139 template<unsigned int dim, typename v_dist> void vd_initialize(v_dist & vd, Vcluster & v_cl, size_t k_int)
140 {
141  // The random generator engine
142  std::default_random_engine eg(v_cl.getProcessUnitID()*4313);
143  std::uniform_real_distribution<float> ud(0.0f, 1.0f);
144 
146 
147  auto it = vd.getIterator();
148 
149  while (it.isNext())
150  {
151  auto key = it.get();
152 
153  for (size_t i = 0; i < dim; i++)
154  vd.getPos(key)[i] = ud(eg);
155 
156  ++it;
157  }
158 
159  vd.map();
160 }
161 
162 
169 template<unsigned int dim, typename v_dist> void vd_initialize_double(v_dist & vd,v_dist & vd2, Vcluster & v_cl, size_t k_int)
170 {
171  // The random generator engine
172  std::default_random_engine eg(v_cl.getProcessUnitID()*4313);
173  std::uniform_real_distribution<float> ud(0.0f, 1.0f);
174 
176 
177  auto it = vd.getIterator();
178 
179  while (it.isNext())
180  {
181  auto key = it.get();
182 
183  for (size_t i = 0; i < dim; i++)
184  {
185  vd.getPos(key)[i] = ud(eg);
186  vd2.getPos(key)[i] = vd.getPos(key)[i];
187  }
188 
189  ++it;
190  }
191 
192  vd.map();
193  vd2.map();
194 }
195 
196 
197 
204 template<unsigned int dim, size_t prp = 0, typename T, typename V> void calc_forces_hilb(T & NN, V & vd, float r_cut)
205 {
206  auto it_cl = NN.getIterator();
207 
208  float sum[dim];
209 
210  for (size_t i = 0; i < dim; i++)
211  sum[i] = 0;
212 
213  while (it_cl.isNext())
214  {
215  //key
216  auto key = it_cl.get();
217 
218  // Get the position of the particles
219  Point<dim,float> p = vd.getPos(key);
220 
221  for (size_t i = 0; i < dim; i++)
222  sum[i] = 0;
223 
224  // Get the neighborhood of the particle
225  auto cell_it = NN.template getNNIterator<NO_CHECK>(NN.getCell(p));
226 
227  while(cell_it.isNext())
228  {
229  auto nnp = cell_it.get();
230 
231  // p != q
232  if (nnp == key)
233  {
234  ++cell_it;
235  continue;
236  }
237 
238  Point<dim,float> q = vd.getPos(nnp);
239 
240  if (p.distance2(q) < r_cut*r_cut)
241  {
242  //Calculate the forces
243  float num[dim];
244  for (size_t i = 0; i < dim; i++)
245  num[i] = vd.getPos(key)[i] - vd.getPos(nnp)[i];
246 
247  float denom = 0;
248  for (size_t i = 0; i < dim; i++)
249  denom += num[i] * num[i];
250 
251  float res[dim];
252  for (size_t i = 0; i < dim; i++)
253  res[i] = num[i] / denom;
254 
255  for (size_t i = 0; i < dim; i++)
256  sum[i] += res[i];
257  }
258  //Next particle in a cell
259  ++cell_it;
260  }
261 
262  //Put the forces
263  for (size_t i = 0; i < dim; i++)
264  vd.template getProp<prp>(key)[i] += sum[i];
265 
266  //Next particle in cell list
267  ++it_cl;
268  }
269 }
270 
271 #endif /* SRC_VECTOR_PERFORMANCE_VECTOR_DIST_PERFORMANCE_COMMON_HPP_ */
size_t getProcessUnitID()
Get the process unit id.
This class implement the point shape in an N-dimensional space.
Definition: Point.hpp:22
Grid key for a distributed grid.
Implementation of VCluster class.
Definition: VCluster.hpp:36
const T & get(size_t i) const
Get coordinate.
Definition: Point.hpp:142
size_t getKey() const
Get the key.
This class is a trick to indicate the compiler a specific specialization pattern. ...
Definition: memory_c.hpp:201
T distance2(const Point< dim, T > &q)
It calculate the square distance between 2 points.
Definition: Point.hpp:240
It model an expression expr1 + ... exprn.
Definition: sum.hpp:92