00001 #include "MagneticField/Interpolation/src/LinearGridInterpolator3D.h"
00002 #include "MagneticField/Interpolation/src/Grid1D.h"
00003 #include "MagneticField/Interpolation/src/Grid3D.h"
00004 #include "MagneticField/VolumeGeometry/interface/MagExceptions.h"
00005
00006 void
00007 LinearGridInterpolator3D::throwGridInterpolator3DException(void)
00008 {
00009 throw GridInterpolator3DException(grida.lower(),gridb.lower(),gridc.lower(),
00010 grida.upper(),gridb.upper(),gridc.upper());
00011 }
00012
00013 LinearGridInterpolator3D::ValueType
00014 LinearGridInterpolator3D::interpolate( Scalar a, Scalar b, Scalar c)
00015 {
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 Scalar s, t, u;
00034 int i = grida.index(a,s);
00035 int j = gridb.index(b,t);
00036 int k = gridc.index(c,u);
00037
00038
00039
00040 grida.normalize(i,s);
00041 gridb.normalize(j,t);
00042 gridc.normalize(k,u);
00043
00044 #ifdef DEBUG_LinearGridInterpolator3D
00045 if (InterpolationDebug::debug) {
00046 using std::cout;
00047 using std::endl;
00048 cout << "LinearGridInterpolator3D called with a,b,c " << a << "," << b << "," << c << endl;
00049 cout <<" i,j,k = " << i << "," << j << "," << k
00050 << " s,t,u = " << s << "," << t << "," << u << endl;
00051 cout << "Node positions for " << i << "," << j << "," << k << " : "
00052 << grida.node(i) << "," << gridb.node(j) << "," << gridc.node(k) << endl;
00053 cout << "Node positions for " << i+1 << "," << j+1 << "," << k+1 << " : "
00054 << grida.node(i+1) << "," << gridb.node(j+1) << "," << gridc.node(k+1) << endl;
00055 cout << "Grid(" << i << "," << j << "," << k << ") = " << grid(i, j, k) << " ";
00056 cout << "Grid(" << i << "," << j << "," << k+1 << ") = " << grid(i,j,k+1) << endl;
00057 cout << "Grid(" << i << "," << j+1 << "," << k << ") = " << grid(i,j+1,k) << " ";
00058 cout << "Grid(" << i << "," << j+1 << "," << k+1 << ") = " << grid(i,j+1,k+1) << endl;
00059 cout << "Grid(" << i+1 << "," << j << "," << k << ") = " << grid(i+1,j,k) << " ";
00060 cout << "Grid(" << i+1 << "," << j << "," << k+1 << ") = " << grid(i+1,j,k+1) << endl;
00061 cout << "Grid(" << i+1 << "," << j+1 << "," << k << ") = " << grid(i+1,j+1,k) << " ";
00062 cout << "Grid(" << i+1 << "," << j+1 << "," << k+1 << ") = " << grid(i+1,j+1,k+1) << endl;
00063 cout << "number of nodes: " << grida.nodes() << "," << gridb.nodes() << "," << gridc.nodes() << endl;
00064
00065
00066
00067
00068
00069 }
00070
00071 #endif
00072
00073 int ind = grid.index(i,j,k);
00074 int s1 = grid.stride1();
00075 int s2 = grid.stride2();
00076 int s3 = grid.stride3();
00077
00078
00079
00080
00081
00082 #if defined(CMS_TEST_RAWSSE)
00083
00084 __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));
00085 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)));
00086 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)));
00087 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)));
00088 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)));
00089 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)));
00090 resultSIMD = _mm_add_ps(resultSIMD, _mm_mul_ps(_mm_set1_ps( s ), _mm_sub_ps(grid(ind + s1 ).v.vec, grid(ind ).v.vec)));
00091 resultSIMD = _mm_add_ps(resultSIMD, grid(ind ).v.vec);
00092
00093 ValueType result; result.v=resultSIMD;
00094
00095
00096 #else
00097
00098 ValueType result = ((1.f-s)*(1.f-t)*u)*(grid(ind +s3) - grid(ind ));
00099 result = result + ((1.f-s)* t *u)*(grid(ind +s2+s3) - grid(ind +s2));
00100 result = result + (s *(1.f-t)*u)*(grid(ind+s1 +s3) - grid(ind+s1 ));
00101 result = result + (s * t *u)*(grid(ind+s1+s2+s3) - grid(ind+s1+s2));
00102 result = result + ( (1.f-s)*t)*(grid(ind +s2 ) - grid(ind ));
00103 result = result + ( s *t)*(grid(ind+s1+s2 ) - grid(ind+s1 ));
00104 result = result + ( s)*(grid(ind+s1 ) - grid(ind ));
00105 result = result + grid(ind );
00106
00107
00108 #endif
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 return result;
00119
00120
00121 }