28 #if 0 // use lookUpTable rather than polinom aproximation 33 vector<float> bX, bY, bZ;
34 float xMin, yMin, dx, dy;
37 void GetBBin(
float x,
float y,
float &bX_,
float &bY_,
float &bZ_ )
const {
38 int iXBin =
static_cast<int>((x - xMin)/dx);
39 int iYBin =
static_cast<int>((y - yMin)/dy);
40 iXBin =
min( iXBin, nXBins-1 );
41 iXBin =
max( 0, iXBin );
42 iYBin =
min( iYBin, nYBins-1 );
43 iYBin =
max( 0, iYBin );
44 const int iBin = iXBin*nYBins + iYBin;
50 void AlocateMemory() {
51 const int NBins = nXBins*nYBins;
64 foreach_bit(
int iV, mask ) {
65 GetBBin( x[iV], y[iV], bX_, bY_, bZ_ );
81 for (
int i = 0;
i < 21;
i++)
82 cx[
i] = cy[
i] = cz[
i] = Vc::Zero;
99 float_v x2y2 = x2 * y2;
100 float_v x3y = x3 * y;
104 float_v xy4 = x * y4;
105 float_v x2y3 = x2 * y3;
106 float_v x3y2 = x3 * y2;
107 float_v x4y = x4 * y;
109 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 +
110 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;
112 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 +
113 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;
115 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 +
116 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;
125 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) {}
127 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]) {}
136 float_v dz = (z - z0);
137 float_v dz2 = dz * dz;
139 B.x = cx0 + cx1 * dz + cx2 * dz2;
140 B.y = cy0 + cy1 * dz + cy2 * dz2;
141 B.z = cz0 + cz1 * dz + cz2 * dz2;
148 float_v dz1 = B1z - B0z, dz2 = B2z - B0z;
150 float_v deti = dz1 * dz2 * (dz2 - dz1);
151 float_m mask = abs(deti) > float_v(1.e-8
f);
153 float_v det =
rcp(float_v(dz1 * dz2 * (dz2 - dz1)));
154 float_v w21 = -dz2 * det;
155 float_v w22 = dz1 * det;
156 float_v w11 = -dz2 * w21;
157 float_v w12 = -dz1 * w22;
159 float_v dB1 = B1.x - B0.x;
160 float_v dB2 = B2.x - B0.x;
162 cx1(mask) = dB1 * w11 + dB2 * w12;
163 cx2(mask) = dB1 * w21 + dB2 * w22;
168 cy1(mask) = dB1 * w11 + dB2 * w12;
169 cy2(mask) = dB1 * w21 + dB2 * w22;
174 cz1(mask) = dB1 * w11 + dB2 * w12;
175 cz2(mask) = dB1 * w21 + dB2 * w22;
181 float_v dzi =
rcp(float_v(B1z - B0z));
185 cx1 = (B1.x - B0.x) * dzi;
186 cy1 = (B1.y - B0.y) * dzi;
187 cz1 = (B1.z - B0.z) * dzi;
194 float_v cx2dz = cx2 * dz;
195 float_v cy2dz = cy2 * dz;
196 float_v cz2dz = cz2 * dz;
198 cx0 += (cx1 + cx2dz) * dz;
199 cy0 += (cy1 + cy2dz) * dz;
200 cz0 += (cz1 + cz2dz) * dz;
201 cx1 += cx2dz + cx2dz;
202 cy1 += cy2dz + cy2dz;
203 cz1 += cz2dz + cz2dz;
208 cx0[i0] = f1.
cx0[i1];
209 cx1[i0] = f1.
cx1[i1];
210 cx2[i0] = f1.
cx2[i1];
211 cy0[i0] = f1.
cy0[i1];
212 cy1[i0] = f1.
cy1[i1];
213 cy2[i0] = f1.
cy2[i1];
214 cz0[i0] = f1.
cz0[i1];
215 cz1[i0] = f1.
cz1[i1];
216 cz2[i0] = f1.
cz2[i1];
250 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)