EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ThreeDeePolynomial.cxx
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file ThreeDeePolynomial.cxx
1 /* -------------------------------------------------------------------------- */
2 /* ThreeDeePolynomial.cc */
3 /* */
4 /* 3D polynomial basic routines. */
5 /* */
6 /* A.Kisselev, PNPI, St.Petersburg, Russia. */
7 /* e-mail: kisselev@hermes.desy.de */
8 /* -------------------------------------------------------------------------- */
9 
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cstring>
13 #include <cmath>
14 #include <cassert>
15 
16 // Yes, need ThreeDeePolySpace definition as well;
17 #include <ThreeDeePolySpace.h>
18 
19 /* ========================================================================== */
20 
22 {
23  // Check later, whether this is really needed;
24  memset(this, 0x00, sizeof(ThreeDeePolynomial));
25 
26  space = _space;
27 
28  linear = new double [space->dim];
29  memset(linear, 0x00, space->dim*sizeof(double));
30 
31  cff = new double** [space->_max_power[_X_]];
32 
33  for(int ix=0; ix<space->_max_power[_X_]; ix++)
34  {
35  cff[ix] = new double* [space->_max_power[_Y_]];
36 
37  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
38  {
39  cff[ix][iy] = new double [space->_max_power[_Z_]];
40  memset(cff[ix][iy], 0x00, space->_max_power[_Z_]*sizeof(double));
41  } /*for*/
42  } /*for*/
43 } /* ThreeDeePolynomial::ThreeDeePolynomial */
44 
45 /* ========================================================================== */
46 
47 double ThreeDeePolynomial::value(double xx[3])
48 {
49  double ret = 0.0, argx[space->_max_power[_X_]];
50  double argy[space->_max_power[_Y_]], argz[space->_max_power[_Z_]];
51 
52  if (off) return 0.0;
53 
54  /* Well, I was not able to make it looking better; */
55  /* pow() is very slow on the other hand; */
56  argx[0] = argy[0] = argz[0] = 1.;
57  for(int ik=1; ik<space->_max_power[_X_]; ik++)
58  argx[ik] = argx[ik-1]*xx[_X_];
59  for(int ik=1; ik<space->_max_power[_Y_]; ik++)
60  argy[ik] = argy[ik-1]*xx[_Y_];
61  for(int ik=1; ik<space->_max_power[_Z_]; ik++)
62  argz[ik] = argz[ik-1]*xx[_Z_];
63 
64  for(int ix=0; ix<space->_max_power[_X_]; ix++)
65  {
66  if (!PARITY_CHECK(space, _X_, ix)) continue;
67 
68  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
69  {
70  if (!PARITY_CHECK(space, _Y_, iy)) continue;
71 
72  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
73  {
74  if (!PARITY_CHECK(space, _Z_, iz)) continue;
75 
76  ret += cff[ix][iy][iz]*argx[ix]*argy[iy]*argz[iz];
77  } /*for iz*/
78  } /*for iy*/
79  } /*for ix*/
80 
81  return ret;
82 } /* ThreeDeePolynomial::value */
83 
84 /* ========================================================================== */
85 
86 double ThreeDeePolynomial::linearValue(double xx[3])
87 {
88  double ret = 0.0;
89 
90  if (off) return 0.;
91 
92  for(int ik=0; ik<space->dim; ik++)
93  ret += linear[ik]*space->basis[ik]->value(xx);
94 
95  return ret;
96 } /* ThreeDeePolynomial::linearValue */
97 
98 /* ========================================================================== */
99 
101 {
102  // Looks ugly, I agree;
103  double norm = sqrtl(space->polyProduct(this, this));
104 
105  if (!norm || (space->norm_cutoff && norm < space->norm_cutoff))
106  {
107  for(int ix=0; ix<space->_max_power[_X_]; ix++)
108  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
109  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
110  cff[ix][iy][iz] = 0.;
111 
112  off = 1;
113 
114  return -1;
115  } /*if*/
116 
117  for(int ix=0; ix<space->_max_power[_X_]; ix++)
118  {
119  if (!PARITY_CHECK(space, _X_, ix)) continue;
120 
121  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
122  {
123  if (!PARITY_CHECK(space, _Y_, iy)) continue;
124 
125  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
126  {
127  if (!PARITY_CHECK(space, _Z_, iz)) continue;
128 
129  cff[ix][iy][iz] /= norm;
130  } /*for iz*/
131  } /*for iy*/
132  } /*for ix*/
133 
134  return 0;
135 } /* ThreeDeePolynomial::normalize */
136 
137 /* -------------------------------------------------------------------------- */
138 
140 {
141  for(int ix=0; ix<space->_max_power[_X_]; ix++)
142  {
143  if (!PARITY_CHECK(space, _X_, ix)) continue;
144 
145  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
146  {
147  if (!PARITY_CHECK(space, _Y_, iy)) continue;
148 
149  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
150  {
151  if (!PARITY_CHECK(space, _Z_, iz)) continue;
152 
153  cff[ix][iy][iz] *= _cff;
154  } /*for iz*/
155  } /*for iy*/
156  } /*for ix*/
157 } /* ThreeDeePolynomial::multiply */
158 
159 /* -------------------------------------------------------------------------- */
160 
162 {
163  for(int ix=0; ix<space->_max_power[_X_]; ix++)
164  {
165  if (!PARITY_CHECK(space, _X_, ix)) continue;
166 
167  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
168  {
169  if (!PARITY_CHECK(space, _Y_, iy)) continue;
170 
171  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
172  {
173  if (!PARITY_CHECK(space, _Z_, iz)) continue;
174 
175  cff[ix][iy][iz] += incr->cff[ix][iy][iz];
176  } /*for iz*/
177  } /*for iy*/
178  } /*for ix*/
179 } /* ThreeDeePolynomial::increment */
180 
181 /* ========================================================================== */
182 
184 {
185  for(int ix=0; ix<space->_max_power[_X_]; ix++)
186  {
187  if (!PARITY_CHECK(space, _X_, ix)) continue;
188 
189  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
190  {
191  if (!PARITY_CHECK(space, _Y_, iy)) continue;
192 
193  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
194  {
195  if (!PARITY_CHECK(space, _Z_, iz)) continue;
196 
197  cff[ix][iy][iz] = 0.;
198 
199  // Or should I rather use poly_multiply() & poly_add()?;
200  for(int ii=0; ii<space->dim; ii++)
201  cff[ix][iy][iz] += linear[ii]*space->basis[ii]->cff[ix][iy][iz];
202  } /*for iz*/
203  } /*for iy*/
204  } /*for ix*/
205 } /* ThreeDeePolynomial::convertLinearToCff */
206 
207 /* ========================================================================== */
208 /* Has this ever been checked?..; */
209 
211 {
212  for(int ik=0; ik<3; ik++)
213  {
214  ThreeDeePolynomial *comp = gradient[ik];
215 
216  for(int ix=0; ix<space->_max_power[_X_]; ix++)
217  {
218  if (!PARITY_CHECK(space, _X_, ix)) continue;
219 
220  for(int iy=0; iy<space->_max_power[_Y_]; iy++)
221  {
222  if (!PARITY_CHECK(space, _Y_, iy)) continue;
223 
224  for(int iz=0; iz<space->_max_power[_Z_]; iz++)
225  {
226  if (!PARITY_CHECK(space, _Z_, iz)) continue;
227 
228  if (ik == _X_ && ix >= 1) comp->cff[ix-1][iy ][iz ] = ix*cff[ix][iy][iz];
229  if (ik == _Y_ && iy >= 1) comp->cff[ix ][iy-1][iz ] = iy*cff[ix][iy][iz];
230  if (ik == _Z_ && iz >= 1) comp->cff[ix ][iy ][iz-1] = iz*cff[ix][iy][iz];
231  } /*for iz*/
232  } /*for iy*/
233  } /*for ix*/
234  } /*for ik*/
235 
236  return 0;
237 } /* ThreeDeePolynomial::calculateGradient */
238 
239 /* ========================================================================== */