OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
FTpsData.h
Go to the documentation of this file.
1 #ifndef CLASSIC_FTpsData_H
2 #define CLASSIC_FTpsData_H
3 
4 // ------------------------------------------------------------------------
5 // $RCSfile: FTpsData.h,v $
6 // ------------------------------------------------------------------------
7 // $Revision: 1.2.2.10 $
8 // ------------------------------------------------------------------------
9 // Copyright: see Copyright.readme
10 // ------------------------------------------------------------------------
11 //
12 // Template class: FTpsData
13 //
14 // ------------------------------------------------------------------------
15 // Class category: FixedAlgebra
16 // ------------------------------------------------------------------------
17 //
18 // $Date: 2004/11/12 18:57:54 $
19 // $Author: adelmann $
20 //
21 // ------------------------------------------------------------------------
22 
23 #include "Algebra/Array1D.h"
25 #include "FixedAlgebra/FArray1D.h"
26 #include "FixedAlgebra/FMonomial.h"
27 
28 // Template class FTpsData<N>
29 // ------------------------------------------------------------------------
31 
32 template <int N>
33 class FTpsData {
34 
35 public:
36 
37  FTpsData();
38  ~FTpsData();
39 
40  // Return exponents for the monomial with given Giorgilli index.
41  static inline const FMonomial<N> &getExponents(int index);
42 
43  // Return the Giorgilli index for a given monomial.
44  static int getIndex(const FMonomial<N> &);
45 
46  // Order of monomial which has Giorgilli index "index".
47  static inline int getOrder(int index);
48 
49  // Number of terms in an FTps<T,N> object of order "order".
50  static inline int getSize(int order);
51 
52  // Index at which order "order" begins; this equals the number
53  // of monomials of degree <= (order - 1) in an FTps<T,N> object.
54  static inline int orderStart(int order);
55 
56  // Index at which order "order" begins for polynomials in nv (<= N) variables.
57  static inline int orderStart(int order, int nv);
58 
59  // One plus the index at which order "order" ends.
60  static inline int orderEnd(int order);
61 
62  // One plus index at which order "order" ends for polynomials in nv (<= N) variables.
63  static inline int orderEnd(int order, int nv);
64 
65  // Number of monomials of degree "order".
66  static inline int orderLength(int order);
67 
68  // Number of monomials such that "orderL" <= degree <= "orderH".
69  static inline int orderLength(int orderL, int orderH);
70 
71  // Return the product index array for monomial "index".
72  static inline const Array1D<int> &getProductArray(int index);
73 
74  // Return the variable list for monomial "index".
75  static inline const Array1D<int> &getVariableList(int index);
76 
77  // Return the substitution table.
78  static inline const Array1D<TpsSubstitution> &getSubTable();
79 
80  // To ensure proper table setup, this method must be
81  // called by FTps whenever a new object is created.
82  static void setup(int order);
83 
84 private:
85 
86  // Not implemented.
87  FTpsData(const FTpsData &);
88  void operator=(const FTpsData &);
89 
90  // Build tables for given order.
91  void build(int order);
92 
93  // Initialise Substitution table.
94  void fillSubst(int var, int order, FMonomial<N> &pow, int &next);
95 
96  // Binomial coefficients: binom[i-1][k] = (i+k)!/(i! k!); used in the indexing
97  // methods getIndex(), getSize(), orderStart(), orderEnd, and orderLength().
99 
100  // Boundary indices for each order.
102 
103  // Exponents: expon[index] = set of exponents in monomial "index".
105 
106  // Indexing information, used for Tps multiplication.
107  // prod[i][j] = index of monomial that results from
108  // multiplying monomials i and j
110 
111  // Indexing information, used for Tps multiplication
112  // using the look-back method. These two arrays are
113  // used to identify which monomial pairs contribute
114  // to a given monomial in the result.
117 
118  // Indexing information, used for Tps multiplication
119  // using the compact index method.
121 
122  // Array of variable lists; used for Tps substitution.
124 
125  // The substitution table.
127 
128  // The current maximum order for which the tables exist.
129  static int topOrder;
130 
131  // The current maximum size of any FTps object.
132  static int topSize;
133 
134  // The singleton object for local book-keeping.
136 };
137 
138 
139 // Class FTpsData, public methods.
140 // ------------------------------------------------------------------------
141 
142 // The singleton object for local book-keeping.
143 template <int N>
145 theBook = new FTpsData<N>();
146 
147 // The current maximum order for which the tables exist.
148 template <int N>
150 
151 // The current maximum size of any FTps object.
152 template <int N>
154 
155 
156 template <int N> inline
158 getExponents(int index) {
159  return theBook->expon[index];
160 }
161 
162 
163 template <int N>
164 int FTpsData<N>::
165 getIndex(const FMonomial<N> &pows) {
166  int order = 0;
167  int index = 0;
168 
169  for(int var = N; var-- > 0;) {
170  order += pows[var];
171  index += theBook->binom[order][var];
172  }
173 
174  return index;
175 }
176 
177 
178 template <int N> inline
179 int FTpsData<N>::
180 getOrder(int index) {
181  return theBook->expon[index].getOrder();
182 }
183 
184 
185 template <int N> inline
186 int FTpsData<N>::
187 getSize(int order) {
188  return theBook->bin[order+1];
189 }
190 
191 
192 template <int N> inline
193 int FTpsData<N>::
194 orderStart(int order) {
195  return theBook->bin[order];
196 }
197 
198 
199 template <int N> inline
200 int FTpsData<N>::
201 orderStart(int order, int nv) {
202  return theBook->binom[order][N-nv];
203 }
204 
205 
206 template <int N> inline
207 int FTpsData<N>::
208 orderEnd(int order) {
209  return theBook->bin[order+1];
210 }
211 
212 
213 template <int N> inline
214 int FTpsData<N>::
215 orderEnd(int order, int nv) {
216  return theBook->binom[order+1][N-nv];
217 }
218 
219 
220 template <int N> inline
221 int FTpsData<N>::
222 orderLength(int order) {
223  // return theBook->bin[order+1] - theBook->bin[order];
224  return theBook->binom[order+1][1];
225 }
226 
227 
228 template <int N> inline
229 int FTpsData<N>::
230 orderLength(int orderL, int orderH) {
231  return theBook->bin[orderH+1] - theBook->bin[orderL];
232 }
233 
234 
235 template <int N> inline
237 getProductArray(int index) {
238  return theBook->prod[index];
239 }
240 
241 
242 template <int N> inline
244 getVariableList(int index) {
245  return theBook->vrblList[index];
246 }
247 
248 
249 //template <int N> inline
250 //const Array1D<int> &FTpsData<N>::
251 //getVariableList(int index)
252 //{
253 // FMonomial<N> jlist = theBook->expon[index];
254 // Array1D<int> *result = new Array1D<int> (jlist.getOrder(),0);
255 //
256 // int k = 0;
257 // for (int v = 0; v < N; ++v) {
258 // int jv = jlist[v];
259 // while (jv-- > 0) (*result)[k++] = v;
260 // }
262 // return *result;
263 //}
264 
265 
266 template <int N> inline
269  return theBook->subTable;
270 }
271 
272 
273 template <int N>
274 void FTpsData<N>::
275 setup(int order) {
276  theBook->build(order);
277 }
278 
279 
280 // Class FTpsData, protected methods.
281 // ------------------------------------------------------------------------
282 
283 template <int N>
286  // Initialize with order 4. May expand later.
287  topOrder = 0;
288  build(4);
289 }
290 
291 
292 template <int N>
295 {}
296 
297 
298 // Class FTpsData, private methods.
299 // ------------------------------------------------------------------------
300 
301 template <int N>
302 void FTpsData<N>::
303 build(int order) {
304  if(topOrder < order) {
305  topOrder = order;
306 
307  // Build array containing binomial coefficients:
308  // binom[0 ... topOrder+1][0 ... N].
309  binom = Array1D < FArray1D < int, N + 1 > > (topOrder + 2);
310  // Here var runs from N to 0.
311  for(int var = N + 1; var-- > 0;) binom[0][var] = 0;
312  for(int ord = 1; ord <= topOrder + 1; ord++) {
313  binom[ord][N] = 1;
314  // Here var runs from N-1 to 0.
315  for(int var = N; var-- > 0;)
316  binom[ord][var] = binom[ord-1][var] + binom[ord][var+1];
317  }
318 
319  // Build array of indices that mark order boundaries.
320  bin = Array1D<int>(topOrder + 2);
321  for(int i = 0; i < topOrder + 2; i++) bin[i] = binom[i][0];
322 
323  // Build table of monomial exponents for orders zero through topOrder.
324  // (algorithm due to Liam Healey (Marylie 3.0)).
325  {
326  topSize = bin[topOrder+1];
327  expon = Array1D < FMonomial<N> >(topSize);
328  FMonomial<N> power;
329 
330  if(N == 1)
331  for(int index = 1; index < topSize; index++) expon[index][0] = index;
332  else
333  for(int index = 1; index < topSize; index++) {
334  int carry = power[N-1];
335  power[N-1] = 0;
336  int lastnz = N - 2;
337  while(power[lastnz] == 0 && lastnz-- > 0) {}
338 
339  if(lastnz == -1) power[0] = 1 + carry;
340  else {
341  power[lastnz]--;
342  power[lastnz+1] += 1 + carry;
343  }
344 
345  expon[index] = power;
346  }
347  }
348 
349  // Build table of products for orders zero through topOrder.
350  {
351  FMonomial<N> power;
352  prod = Array1D < Array1D<int> >(topSize);
353  for(int xord = 0; xord <= topOrder; xord++) {
354  int yord = topOrder - xord;
355  int ysize = bin[yord+1];
356  for(int i = bin[xord]; i < bin[xord+1]; i++) {
357  prod[i] = Array1D<int>(ysize);
358  // use symmetry for LL half of prod array
359  for(int j = 0; j < std::min(i, ysize); j++) {
360  prod[i][j] = prod[j][i];
361  }
362  for(int j = i; j < ysize; j++) {
363  power = expon[i] * expon[j];
364  int ord = 0;
365  int ind = 0;
366  for(int vv = N; vv-- > 0;) {
367  ord += power[vv];
368  ind += binom[ord][vv];
369  }
370  prod[i][j] = ind;
371  }
372  }
373  }
374  }
375 
376  // Build table of variable lists.
377  {
378  // Allocate variable list pointers and working array.
379  vrblList = Array1D< Array1D<int> >(topSize);
380  int *vars = new int[topOrder];
381  // Initialise counter.
382  int j = 1, N1 = N - 1;
383  // Loop over the orders.
384  for(int ord = 1; ord <= topOrder; ord++) {
385  // Allocate first variable list; initialise both it and vars.
386  vrblList[j] = Array1D<int>(ord, 0);
387  std::fill(vars, vars + ord, int(0));
388  // Define end points.
389  int last_j = bin[ord+1];
390  int *vlast = vars + ord;
391  // Build remaining variable lists at this order.
392  while(++j < last_j) {
393  // From last variable list (in vars), construct next one.
394  int *vi = vlast;
395  while(*--vi == N1) {};
396  int k = *vi + 1;
397  std::fill(vi, vlast, k);
398  // Allocate j-th variable list and copy from vars.
399  vrblList[j] = Array1D<int>(ord);
400  std::copy(vars, vars + ord, vrblList[j].begin());
401  }
402  }
403  delete [] vars;
404  }
405 
406  // Build the substitution table.
407  {
408  subTable = Array1D<TpsSubstitution>(topSize);
409  FMonomial<N> power;
410  int next = 1;
411  fillSubst(0, 1, power, next);
412  }
413  }
414 }
415 
416 
417 template <int N>
418 void FTpsData<N>::
419 fillSubst(int var, int order, FMonomial<N> &power, int &next) {
420  for(int v = var; v < N; v++) {
421  TpsSubstitution &s = subTable[next];
422  power[v]++;
423  int ord = 0;
424  int ind = 0;
425  for(int vv = N; vv-- > 0;) {
426  ord += power[vv];
427  ind += binom[ord][vv];
428  }
429  s.index = ind;
430  s.order = order;
431  s.variable = v;
432  next++;
433  if(order < topOrder) fillSubst(v, order + 1, power, next);
434  s.skip = next;
435  power[v]--;
436  }
437 }
438 
439 #endif // CLASSIC_FTpsData_H
static const FMonomial< N > & getExponents(int index)
Definition: FTpsData.h:158
Substitution for Tps&lt;T&gt;.
static int orderEnd(int order)
Definition: FTpsData.h:208
and give any other recipients of the Program a copy of this License along with the Program You may charge a fee for the physical act of transferring a copy
Definition: LICENSE:87
void operator=(const FTpsData &)
static int orderLength(int order)
Definition: FTpsData.h:222
static int getOrder(int index)
Definition: FTpsData.h:180
Array1D< int > bin
Definition: FTpsData.h:101
Array1D< int > lbBound
Definition: FTpsData.h:116
static int orderStart(int order)
Definition: FTpsData.h:194
static int getIndex(const FMonomial< N > &)
Definition: FTpsData.h:165
clearpage the user may choose between constant or variable radius This model includes fringe fields begin
Definition: multipole_t.tex:6
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:76
static int getSize(int order)
Definition: FTpsData.h:187
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
Definition: PETE.h:1121
Array1D< FMonomial< N > > expon
Definition: FTpsData.h:104
Array1D< int > lookBack
Definition: FTpsData.h:115
static int topSize
Definition: FTpsData.h:132
Array1D< int > Giorgilli2ExponIndex
Definition: FTpsData.h:120
Array1D< Array1D< int > > prod
Definition: FTpsData.h:109
void build(int order)
Definition: FTpsData.h:303
FTpsData()
Definition: FTpsData.h:285
~FTpsData()
Definition: FTpsData.h:294
static const Array1D< TpsSubstitution > & getSubTable()
Definition: FTpsData.h:268
static const Array1D< int > & getVariableList(int index)
Definition: FTpsData.h:244
static FTpsData< N > * theBook
Definition: FTpsData.h:135
static int topOrder
Definition: FTpsData.h:129
Internal utility class for FTps&lt;T,N&gt; class.
Definition: FTpsData.h:33
void fillSubst(int var, int order, FMonomial< N > &pow, int &next)
Definition: FTpsData.h:419
Array1D< Array1D< int > > vrblList
Definition: FTpsData.h:123
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Definition: TpsMath.h:76
Array1D< TpsSubstitution > subTable
Definition: FTpsData.h:126
static const Array1D< int > & getProductArray(int index)
Definition: FTpsData.h:237
Representation of the exponents for a monomial with fixed dimension.
Definition: FMonomial.h:32
Array1D< FArray1D< int, N+1 > > binom
Definition: FTpsData.h:98
static void setup(int order)
Definition: FTpsData.h:275