16 #if 0 // use lookUpTable rather than polinom aproximation 21 vector<float> bX, bY, bZ;
22 float xMin, yMin, dx, dy;
25 void GetBBin(
float x,
float y,
float &bX_,
float &bY_,
float &bZ_ )
const {
26 int iXBin =
static_cast<int>((x - xMin)/dx);
27 int iYBin =
static_cast<int>((y - yMin)/dy);
28 iXBin =
min( iXBin, nXBins-1 );
29 iXBin =
max( 0, iXBin );
30 iYBin =
min( iYBin, nYBins-1 );
31 iYBin =
max( 0, iYBin );
32 const int iBin = iXBin*nYBins + iYBin;
38 void AlocateMemory() {
39 const int NBins = nXBins*nYBins;
52 foreach_bit(
int iV, mask ) {
53 GetBBin( x[iV], y[iV], bX_, bY_, bZ_ );
69 for (
int i = 0;
i < 21;
i++)
70 cx[
i] = cy[
i] = cz[
i] = Vc::Zero;
87 float_v x2y2 = x2 * y2;
93 float_v x2y3 = x2 * y3;
94 float_v x3y2 = x3 * y2;
97 B.x(mask) = cx[0] + cx[1] * x + cx[2] * y + cx[3] * x2 + cx[4] * xy + cx[5] * y2 + cx[6] * x3 + cx[7] * x2y + cx[8] * xy2 + cx[9] * y3 + cx[10] * x4 + cx[11] * x3y +
98 cx[12] * x2y2 + cx[13] * xy3 + cx[14] * y4 + cx[15] * x5 + cx[16] * x4y + cx[17] * x3y2 + cx[18] * x2y3 + cx[19] * xy4 + cx[20] * y5;
100 B.y(mask) = cy[0] + cy[1] * x + cy[2] * y + cy[3] * x2 + cy[4] * xy + cy[5] * y2 + cy[6] * x3 + cy[7] * x2y + cy[8] * xy2 + cy[9] * y3 + cy[10] * x4 + cy[11] * x3y +
101 cy[12] * x2y2 + cy[13] * xy3 + cy[14] * y4 + cy[15] * x5 + cy[16] * x4y + cy[17] * x3y2 + cy[18] * x2y3 + cy[19] * xy4 + cy[20] * y5;
103 B.z(mask) = cz[0] + cz[1] * x + cz[2] * y + cz[3] * x2 + cz[4] * xy + cz[5] * y2 + cz[6] * x3 + cz[7] * x2y + cz[8] * xy2 + cz[9] * y3 + cz[10] * x4 + cz[11] * x3y +
104 cz[12] * x2y2 + cz[13] * xy3 + cz[14] * y4 + cz[15] * x5 + cz[16] * x4y + cz[17] * x3y2 + cz[18] * x2y3 + cz[19] * xy4 + cz[20] * y5;
113 L1FieldRegion() : cx0(Vc::Zero), cx1(Vc::Zero), cx2(Vc::Zero), cy0(Vc::Zero), cy1(Vc::Zero), cy2(Vc::Zero), cz0(Vc::Zero), cz1(Vc::Zero), cz2(Vc::Zero), z0(Vc::Zero) {}
115 L1FieldRegion(
float reg[10]) : cx0(reg[0]), cx1(reg[1]), cx2(reg[2]), cy0(reg[3]), cy1(reg[4]), cy2(reg[5]), cz0(reg[6]), cz1(reg[7]), cz2(reg[8]), z0(reg[9]) {}
124 float_v dz = (z - z0);
125 float_v dz2 = dz * dz;
127 B.x = cx0 + cx1 * dz + cx2 * dz2;
128 B.y = cy0 + cy1 * dz + cy2 * dz2;
129 B.z = cz0 + cz1 * dz + cz2 * dz2;
136 float_v dz1 = B1z - B0z, dz2 = B2z - B0z;
138 float_v deti = dz1 * dz2 * (dz2 - dz1);
139 float_m mask = abs(deti) > float_v(1.e-8
f);
141 float_v det =
rcp(float_v(dz1 * dz2 * (dz2 - dz1)));
142 float_v w21 = -dz2 * det;
143 float_v w22 = dz1 * det;
144 float_v w11 = -dz2 * w21;
145 float_v w12 = -dz1 * w22;
147 float_v dB1 = B1.x - B0.x;
148 float_v dB2 = B2.x - B0.x;
150 cx1(mask) = dB1 * w11 + dB2 * w12;
151 cx2(mask) = dB1 * w21 + dB2 * w22;
156 cy1(mask) = dB1 * w11 + dB2 * w12;
157 cy2(mask) = dB1 * w21 + dB2 * w22;
162 cz1(mask) = dB1 * w11 + dB2 * w12;
163 cz2(mask) = dB1 * w21 + dB2 * w22;
169 float_v dzi =
rcp(float_v(B1z - B0z));
173 cx1 = (B1.x - B0.x) * dzi;
174 cy1 = (B1.y - B0.y) * dzi;
175 cz1 = (B1.z - B0.z) * dzi;
182 float_v cx2dz = cx2 * dz;
183 float_v cy2dz = cy2 * dz;
184 float_v cz2dz = cz2 * dz;
186 cx0 += (cx1 + cx2dz) * dz;
187 cy0 += (cy1 + cy2dz) * dz;
188 cz0 += (cz1 + cz2dz) * dz;
189 cx1 += cx2dz + cx2dz;
190 cy1 += cy2dz + cy2dz;
191 cz1 += cz2dz + cz2dz;
196 cx0[i0] = f1.
cx0[i1];
197 cx1[i0] = f1.
cx1[i1];
198 cx2[i0] = f1.
cx2[i1];
199 cy0[i0] = f1.
cy0[i1];
200 cy1[i0] = f1.
cy1[i1];
201 cy2[i0] = f1.
cy2[i1];
202 cz0[i0] = f1.
cz0[i1];
203 cz1[i0] = f1.
cz1[i1];
204 cz2[i0] = f1.
cz2[i1];
238 return out <<
" FieldRegion " << endl
void Set(const CAFieldValue &B0, const float_v B0z, const CAFieldValue &B1, const float_v B1z)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
friend ostream & operator<<(ostream &out, L1FieldRegion &B)
void GetOneEntry(float reg[10], const int iVec)
L1FieldRegion(float reg[10])
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
void Set(const CAFieldValue &B0, const float_v B0z, const CAFieldValue &B1, const float_v B1z, const CAFieldValue &B2, const float_v B2z)
basic_ostream< char, char_traits< char > > ostream
void SetOneEntry(const L1FieldRegion &f1, const int i1)
void GetFieldValue(const float_v &x, const float_v &y, CAFieldValue &B, const float_m &mask=float_m(true)) const
CAFieldValue Get(const float_v z)
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)