CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
LinearGridInterpolator3D.cc
Go to the documentation of this file.
2 #include "Grid1D.h"
3 #include "Grid3D.h"
5 
6 void
8 {
11 }
12 
15 {
16  /*
17  int i = grida.index(a);
18  int j = gridb.index(b);
19  int k = gridc.index(c);
20 
21  if (i==-1 || j==-1 || k==-1) {
22  // point outside of grid validity!
23  throwGridInterpolator3DException();
24  }
25 
26 
27  Scalar s = (a - grida.node(i)) / grida.step();
28  Scalar t = (b - gridb.node(j)) / gridb.step();
29  Scalar u = (c - gridc.node(k)) / gridc.step();
30 
31  */
32 
33  Scalar s, t, u;
34  int i = grida.index(a,s);
35  int j = gridb.index(b,t);
36  int k = gridc.index(c,u);
37 
38  // test range??
39 
40  grida.normalize(i,s);
41  gridb.normalize(j,t);
42  gridc.normalize(k,u);
43 
44 #ifdef DEBUG_LinearGridInterpolator3D
46  using std::cout;
47  using std::endl;
48  cout << "LinearGridInterpolator3D called with a,b,c " << a << "," << b << "," << c << endl;
49  cout <<" i,j,k = " << i << "," << j << "," << k
50  << " s,t,u = " << s << "," << t << "," << u << endl;
51  cout << "Node positions for " << i << "," << j << "," << k << " : "
52  << grida.node(i) << "," << gridb.node(j) << "," << gridc.node(k) << endl;
53  cout << "Node positions for " << i+1 << "," << j+1 << "," << k+1 << " : "
54  << grida.node(i+1) << "," << gridb.node(j+1) << "," << gridc.node(k+1) << endl;
55  cout << "Grid(" << i << "," << j << "," << k << ") = " << grid(i, j, k) << " ";
56  cout << "Grid(" << i << "," << j << "," << k+1 << ") = " << grid(i,j,k+1) << endl;
57  cout << "Grid(" << i << "," << j+1 << "," << k << ") = " << grid(i,j+1,k) << " ";
58  cout << "Grid(" << i << "," << j+1 << "," << k+1 << ") = " << grid(i,j+1,k+1) << endl;
59  cout << "Grid(" << i+1 << "," << j << "," << k << ") = " << grid(i+1,j,k) << " ";
60  cout << "Grid(" << i+1 << "," << j << "," << k+1 << ") = " << grid(i+1,j,k+1) << endl;
61  cout << "Grid(" << i+1 << "," << j+1 << "," << k << ") = " << grid(i+1,j+1,k) << " ";
62  cout << "Grid(" << i+1 << "," << j+1 << "," << k+1 << ") = " << grid(i+1,j+1,k+1) << endl;
63  cout << "number of nodes: " << grida.nodes() << "," << gridb.nodes() << "," << gridc.nodes() << endl;
64 
65 // cout << (1-s)*(1-t)*(1-u)*grid(i, j, k) << " " << (1-s)*(1-t)*u*grid(i, j, k+1) << endl
66 // << (1-s)* t *(1-u)*grid(i, j+1,k) << " " << (1-s)* t *u*grid(i, j+1,k+1) << endl
67 // << s *(1-t)*(1-u)*grid(i+1,j, k) << " " << s *(1-t)*u*grid(i+1,j, k+1) << endl
68 // << s * t *(1-u)*grid(i+1,j+1,k) << " " << s * t *u*grid(i+1,j+1,k+1) << endl;
69  }
70 
71 #endif
72 
73  int ind = grid.index(i,j,k);
74  int s1 = grid.stride1();
75  int s2 = grid.stride2();
76  int s3 = grid.stride3();
77  //chances are this is more numerically precise this way
78 
79 
80 
81  // this code for test to check properly inline of wrapped math...
82 #if defined(CMS_TEST_RAWSSE)
83 
84  __m128 resultSIMD = _mm_mul_ps(_mm_set1_ps((1.f - s) * (1.f - t) * u), _mm_sub_ps(grid(ind + s3).v.vec, grid(ind ).v.vec));
85  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps((1.f - s) * t * u), _mm_sub_ps(grid(ind + s2 + s3).v.vec, grid(ind + s2).v.vec)));
86  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps( s * (1.f - t) * u), _mm_sub_ps(grid(ind + s1 + s3).v.vec, grid(ind + s1 ).v.vec)));
87  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps( s * t * u), _mm_sub_ps(grid(ind + s1 + s2 + s3).v.vec, grid(ind + s1 + s2).v.vec)));
88  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps((1.f - s) * t ), _mm_sub_ps(grid(ind + s2 ).v.vec, grid(ind ).v.vec)));
89  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps( s * t ), _mm_sub_ps(grid(ind + s1 + s2 ).v.vec, grid(ind + s1 ).v.vec)));
90  resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps( s ), _mm_sub_ps(grid(ind + s1 ).v.vec, grid(ind ).v.vec)));
91  resultSIMD = _mm_add_ps(resultSIMD, grid(ind ).v.vec);
92 
93  ValueType result; result.v=resultSIMD;
94 
95 
96 #else
97 
98  ValueType result = ((1.f-s)*(1.f-t)*u)*(grid(ind +s3) - grid(ind ));
99  result = result + ((1.f-s)* t *u)*(grid(ind +s2+s3) - grid(ind +s2));
100  result = result + (s *(1.f-t)*u)*(grid(ind+s1 +s3) - grid(ind+s1 ));
101  result = result + (s * t *u)*(grid(ind+s1+s2+s3) - grid(ind+s1+s2));
102  result = result + ( (1.f-s)*t)*(grid(ind +s2 ) - grid(ind ));
103  result = result + ( s *t)*(grid(ind+s1+s2 ) - grid(ind+s1 ));
104  result = result + ( s)*(grid(ind+s1 ) - grid(ind ));
105  result = result + grid(ind );
106 
107 
108 #endif
109 
110 
111 
112  // (1-s)*(1-t)*(1-u)*grid(i, j, k) + (1-s)*(1-t)*u*grid(i, j, k+1) +
113  // (1-s)* t *(1-u)*grid(i, j+1,k) + (1-s)* t *u*grid(i, j+1,k+1) +
114  // s *(1-t)*(1-u)*grid(i+1,j, k) + s *(1-t)*u*grid(i+1,j, k+1) +
115  // s * t *(1-u)*grid(i+1,j+1,k) + s * t *u*grid(i+1,j+1,k+1);
116 
117 
118  return result;
119 
120 
121 }
int i
Definition: DBlmapReader.cc:9
int stride3() const
Definition: Grid3D.h:58
int stride2() const
Definition: Grid3D.h:57
ReturnType interpolate(Scalar a, Scalar b, Scalar c)
Scalar node(int i) const
Definition: Grid1D.h:27
int index(int i, int j, int k) const
Definition: Grid3D.h:55
tuple s2
Definition: indexGen.py:106
int nodes() const
Definition: Grid1D.h:24
tuple result
Definition: query.py:137
int j
Definition: DBlmapReader.cc:9
double f[11][100]
int stride1() const
Definition: Grid3D.h:56
static const bool debug
Scalar lower() const
Definition: Grid1D.h:22
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
void normalize(int &ind, Scalar &f) const
Definition: Grid1D.h:41
tuple cout
Definition: gather_cfg.py:145
int index(Scalar a, Scalar &f) const
Definition: Grid1D.h:34
Scalar upper() const
Definition: Grid1D.h:23