KADATH
coef_i_1d.cpp
1 /*
2  Copyright 2017 Philippe Grandclement
3  2018 Ludwig Jens Papenfort
4 
5  This file is part of Kadath.
6 
7  Kadath is free software: you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation, either version 3 of the License, or
10  (at your option) any later version.
11 
12  Kadath is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with Kadath. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "base_spectral.hpp"
22 #include "base_fftw.hpp"
23 #include "headcpp.hpp"
24 #include "array.hpp"
25 #include <fftw3.h>
26 #include <unordered_map>
27 #include <tuple>
28 
29 namespace Kadath {
30 // fftw3 computes optimal algorithm once
31 // then we store it both in a map for later use
32 std::unordered_map<int, fftw_precomp_t> fftw_precomp_map_i;
33 
34 // get or create buffer and plan
35 fftw_precomp_t& coef_i_1d_fftw(int n) {
36  auto precomp_it = fftw_precomp_map_i.find(n);
37  if(precomp_it == fftw_precomp_map_i.end())
38  precomp_it = fftw_precomp_map_i.emplace(std::piecewise_construct,
39  std::forward_as_tuple(n),
40  std::forward_as_tuple(n,FFTW_HC2R)).first;
41  return (*precomp_it).second;
42 }
43 
44 void coef_i_1d_pasprevu (Array<double>&) {
45  cout << "Coef_1d not implemented." << endl ;
46  abort() ;
47 }
48 
49 void coef_i_1d_cheb (Array<double>& tab) {
50 
51  assert (tab.get_ndim()==1) ;
52  int nbr = tab.get_size(0) ;
53 
54  if (nbr>3) {
55 
56  auto & fftw_data = coef_i_1d_fftw(nbr-1);
57  double* tab_auxi = fftw_data.buffer;
58  fftw_plan p = fftw_data.plan;
59 
60  double* cf = new double[nbr];
61 
62  double c1 = tab(1) ;
63  double somme = 0 ;
64  cf[1] = 0 ;
65  for (int i=3 ; i<nbr ; i+=2) {
66  cf[i] = tab(i) - c1 ;
67  somme += cf[i] ;
68  }
69  double fmoins0 = -(nbr-1)/2 *c1- somme ;
70  for (int i=3 ; i<nbr ; i+=2)
71  tab_auxi[nbr-1-i/2] = -0.25*(cf[i]-cf[i-2]) ;
72  tab_auxi[0] = tab(0) ;
73  for (int i=1 ; i<(nbr-1)/2 ; i++)
74  tab_auxi[i] = 0.5*tab(2*i) ;
75  tab_auxi[(nbr-1)/2] = tab(nbr-1) ;
76 
77  fftw_data.execute() ;
78 
79  for (int i=1 ; i<(nbr-1)/2 ; i++) {
80  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
81  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
82  tab.set(i) = fp+fm ;
83  tab.set(nbr-i-1) = fp -fm ;
84  }
85  tab.set(0) = tab_auxi[0] + fmoins0 ;
86  tab.set(nbr-1) = tab_auxi[0] - fmoins0 ;
87  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
88 
89  delete [] cf ;
90  }
91 }
92 
93 void coef_i_1d_cheb_even (Array<double>& tab) {
94 
95  assert (tab.get_ndim()==1) ;
96  int nbr = tab.get_size(0) ;
97 
98  auto & fftw_data = coef_i_1d_fftw(nbr-1);
99  double* tab_auxi = fftw_data.buffer;
100  fftw_plan p = fftw_data.plan;
101 
102  double* cf = new double[nbr] ;
103 
104  double c1 = tab(1) ;
105  double somme = 0 ;
106  cf[1] = 0 ;
107  for (int i=3 ; i<nbr ; i+=2) {
108  cf[i] = tab(i) - c1 ;
109  somme += cf[i] ;
110  }
111  double fmoins0 = (nbr-1)/2 *c1+somme ;
112  for (int i=3 ; i<nbr ; i+=2)
113  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
114  tab_auxi[0] = tab(0) ;
115  for (int i=1 ; i<(nbr-1)/2 ; i++)
116  tab_auxi[i] = 0.5*tab(2*i) ;
117  tab_auxi[(nbr-1)/2] = tab(nbr-1) ;
118 
119  fftw_data.execute() ;
120 
121  for (int i=1 ; i<(nbr-1)/2 ; i++) {
122  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
123  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
124  tab.set(nbr-1-i) = fp+fm ;
125  tab.set(i) = fp -fm ;
126  }
127  tab.set(0) = tab_auxi[0] - fmoins0 ;
128  tab.set(nbr-1) = tab_auxi[0] + fmoins0 ;
129  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
130 
131  delete [] cf ;
132 }
133 
134 void coef_i_1d_cheb_odd (Array<double>& tab) {
135 
136  assert (tab.get_ndim()==1) ;
137  int nbr = tab.get_size(0) ;
138 
139  auto & fftw_data = coef_i_1d_fftw(nbr-1);
140  double* tab_auxi = fftw_data.buffer;
141  fftw_plan p = fftw_data.plan;
142 
143  double* ti = new double [nbr] ;
144  double* cf = new double [nbr] ;
145 
146  ti[0] = 0.5*tab(0) ;
147  for (int i=1 ; i<nbr-1 ; i++)
148  ti[i] = 0.5*(tab(i)+tab(i-1)) ;
149  ti[nbr-1] = 0.5*tab(nbr-2) ;
150 
151  double c1 = ti[1] ;
152  double somme = 0 ;
153  cf[1] = 0 ;
154  for (int i=3 ; i<nbr ; i+=2) {
155  cf[i] = ti[i] - c1 ;
156  somme += cf[i] ;
157  }
158  double fmoins0 = (nbr-1)/2 *c1+ somme ;
159  for (int i=3 ; i<nbr ; i+=2)
160  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
161  tab_auxi[0] = ti[0] ;
162  for (int i=1 ; i<(nbr-1)/2 ; i++)
163  tab_auxi[i] = 0.5*ti[2*i] ;
164  tab_auxi[(nbr-1)/2]=ti[nbr-1] ;
165 
166  fftw_data.execute() ;
167 
168  for (int i=1 ; i<(nbr-1)/2 ; i++) {
169  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
170  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
171  tab.set(nbr-1-i) = (fp+fm)/sin(M_PI*(nbr-1-i)/2/(nbr-1)) ;
172  tab.set(i) = (fp -fm)/sin(M_PI*i/2/(nbr-1)) ;
173  }
174  tab.set(0) = 0 ;
175  tab.set(nbr-1) = tab_auxi[0] + fmoins0 ;
176  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2]/sin(M_PI*(nbr-1)/4/(nbr-1)) ;
177 
178  delete [] ti ;
179  delete [] cf ;
180 }
181 
182 double coloc_leg(int,int) ;
183 double summation_1d_leg(double xx, const Array<double>&) ;
184 double coloc_leg_parity(int,int) ;
185 double summation_1d_leg_even(double xx, const Array<double>&) ;
186 double summation_1d_leg_odd(double xx, const Array<double>&) ;
187 
188 void coef_i_1d_leg (Array<double>& tab) {
189 
190  assert (tab.get_ndim()==1) ;
191  int nbr = tab.get_size(0) ;
192 
193  Array<double> res(nbr) ;
194  for (int i=0 ; i<nbr ; i++)
195  res.set(i) = summation_1d_leg(coloc_leg(i,nbr), tab) ;
196  tab=res ;
197 }
198 
199 void coef_i_1d_leg_even (Array<double>& tab) {
200 
201  assert (tab.get_ndim()==1) ;
202  int nbr = tab.get_size(0) ;
203 
204  Array<double> res(nbr) ;
205  for (int i=0 ; i<nbr ; i++)
206  res.set(i) = summation_1d_leg_even(coloc_leg_parity(i,nbr), tab) ;
207  tab=res ;
208 }
209 
210 void coef_i_1d_leg_odd (Array<double>& tab) {
211 
212  assert (tab.get_ndim()==1) ;
213  int nbr = tab.get_size(0) ;
214 
215  Array<double> res(nbr) ;
216  for (int i=0 ; i<nbr ; i++)
217  res.set(i) = summation_1d_leg_odd(coloc_leg_parity(i,nbr), tab) ;
218  tab=res ;
219 }
220 
221 void coef_i_1d_cossin (Array<double>& tab) {
222 
223  assert (tab.get_ndim()==1) ;
224  int nbr = tab.get_size(0) ;
225  int np = nbr-2 ;
226  if (np>1) {
227 
228  auto & fftw_data = coef_i_1d_fftw(np);
229  double* cf = fftw_data.buffer;
230  fftw_plan p = fftw_data.plan;
231 
232  cf[0] = tab(0) ;
233  for (int i=1 ; i<np/2 ; i++) {
234  cf[i] = 0.5*tab(2*i) ;
235  cf[np-i] = -0.5*tab(2*i+1) ;
236  }
237  cf[np/2] = tab(np) ;
238  fftw_data.execute() ;
239 
240  for (int i=0 ; i<np ; i++)
241  tab.set(i) = cf[i] ;
242  }
243 }
244 
245 void coef_i_1d_cos (Array<double>& tab) {
246 
247  assert (tab.get_ndim()==1) ;
248  int nbr = tab.get_size(0) ;
249 
250  auto & fftw_data = coef_i_1d_fftw(nbr-1);
251  double* tab_auxi = fftw_data.buffer;
252  fftw_plan p = fftw_data.plan;
253 
254  double* cf = new double [nbr] ;
255 
256  double c1 = tab(1) ;
257  double somme = 0 ;
258  cf[1] = 0 ;
259  for (int i=3 ; i<nbr ; i+=2) {
260  cf[i] = tab(i) - c1 ;
261  somme += cf[i] ;
262  }
263  double fmoins0 = (nbr-1)/2 *c1+ somme ;
264  for (int i=3 ; i<nbr ; i+=2)
265  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
266  tab_auxi[0] = tab(0) ;
267  for (int i=1 ; i<(nbr-1)/2 ; i++)
268  tab_auxi[i] = 0.5*tab(2*i) ;
269  tab_auxi[(nbr-1)/2] = tab(nbr-1) ;
270 
271  fftw_data.execute() ;
272 
273  for (int i=1 ; i<(nbr-1)/2 ; i++) {
274  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
275  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
276  tab.set(i) = fp+fm ;
277  tab.set(nbr-i-1) = fp -fm ;
278  }
279  tab.set(0) = tab_auxi[0] + fmoins0 ;
280  tab.set(nbr-1) = tab_auxi[0] - fmoins0 ;
281  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
282 
283  delete [] cf;
284 }
285 
286 void coef_i_1d_sin (Array<double>& tab) {
287 
288  assert (tab.get_ndim()==1) ;
289  int nbr = tab.get_size(0) ;
290 
291  auto & fftw_data = coef_i_1d_fftw(nbr-1);
292  double* tab_auxi = fftw_data.buffer;
293  fftw_plan p = fftw_data.plan;
294 
295  for (int i=2 ; i<nbr-1 ; i+=2)
296  tab_auxi[nbr-1-i/2] = -0.5*tab(i) ;
297  tab_auxi[0] = 0.5*tab(1) ;
298  for (int i=3 ; i<nbr ; i+=2)
299  tab_auxi[i/2] = 0.25*(tab(i)-tab(i-2)) ;
300  tab_auxi[(nbr-1)/2] = -0.5*tab(nbr-2) ;
301 
302  fftw_data.execute() ;
303 
304  for (int i=1 ; i<(nbr-1)/2 ; i++) {
305  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
306  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i]) ;
307  tab.set(i) = fp+fm ;
308  tab.set(nbr-i-1) = fp -fm ;
309  }
310  tab.set(0) = 0 ;
311  tab.set(nbr-1) =-2* tab_auxi[0] ;
312  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
313 }
314 
315 void coef_i_1d_cos_even (Array<double>& tab) {
316 
317  assert (tab.get_ndim()==1) ;
318  int nbr = tab.get_size(0) ;
319  if (nbr>3) {
320  double* cf = new double [nbr] ;
321 
322  auto & fftw_data = coef_i_1d_fftw(nbr-1);
323  double* tab_auxi = fftw_data.buffer;
324  fftw_plan p = fftw_data.plan;
325 
326  double c1 = tab(1) ;
327  double somme = 0 ;
328  cf[1] = 0 ;
329  for (int i=3 ; i<nbr ; i+=2) {
330  cf[i] = tab(i) - c1 ;
331  somme += cf[i] ;
332  }
333  double fmoins0 = (nbr-1)/2 *c1+ somme ;
334  for (int i=3 ; i<nbr ; i+=2)
335  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
336  tab_auxi[0] = tab(0) ;
337  for (int i=1 ; i<(nbr-1)/2 ; i++)
338  tab_auxi[i] = 0.5*tab(2*i) ;
339  tab_auxi[(nbr-1)/2] = tab(nbr-1) ;
340 
341  fftw_data.execute() ;
342 
343  for (int i=1 ; i<(nbr-1)/2 ; i++) {
344  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
345  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
346  tab.set(i) = fp+fm ;
347  tab.set(nbr-i-1) = fp -fm ;
348  }
349  tab.set(0) = tab_auxi[0] + fmoins0 ;
350  tab.set(nbr-1) = tab_auxi[0] - fmoins0 ;
351  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
352 
353  delete [] cf;
354  }
355 }
356 
357 void coef_i_1d_cos_odd (Array<double>& tab) {
358 
359  assert (tab.get_ndim()==1) ;
360  int nbr = tab.get_size(0) ;
361  if (nbr>3) {
362  double* ti = new double[nbr] ;
363  double* cf = new double[nbr] ;
364 
365  auto & fftw_data = coef_i_1d_fftw(nbr-1);
366  double* tab_auxi = fftw_data.buffer;
367  fftw_plan p = fftw_data.plan;
368 
369  ti[0] = 0.5*tab(0) ;
370  for (int i=1 ; i<nbr-1 ; i++)
371  ti[i] = 0.5*(tab(i)+tab(i-1)) ;
372  ti[nbr-1] = 0.5*tab(nbr-2) ;
373 
374  double c1 = ti[1] ;
375  double somme = 0 ;
376  cf[1] = 0 ;
377  for (int i=3 ; i<nbr ; i+=2) {
378  cf[i] = ti[i] - c1 ;
379  somme += cf[i] ;
380  }
381  double fmoins0 = (nbr-1)/2 *c1+ somme ;
382  for (int i=3 ; i<nbr ; i+=2)
383  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
384  tab_auxi[0] = ti[0] ;
385  for (int i=1 ; i<(nbr-1)/2 ; i++)
386  tab_auxi[i] = 0.5*ti[2*i] ;
387  tab_auxi[(nbr-1)/2] = ti[nbr-1] ;
388 
389  fftw_data.execute() ;
390 
391  for (int i=1 ; i<(nbr-1)/2 ; i++) {
392  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
393  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
394  tab.set(i) = (fp+fm)/sin(M_PI*(nbr-1-i)/2/(nbr-1)) ;
395  tab.set(nbr-i-1) = (fp -fm)/sin(M_PI*i/2/(nbr-1)) ;
396  }
397  tab.set(0) = tab_auxi[0] + fmoins0 ;
398  tab.set(nbr-1) = 0 ;
399  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2]/sin(M_PI*(nbr-1)/4/(nbr-1)) ;
400 
401  delete [] ti ;
402  delete [] cf ;
403  }
404 }
405 
406 void coef_i_1d_sin_even (Array<double>& tab) {
407 
408  assert (tab.get_ndim()==1) ;
409  int nbr = tab.get_size(0) ;
410  if (nbr>3) {
411 
412  auto & fftw_data = coef_i_1d_fftw(nbr-1);
413  double* tab_auxi = fftw_data.buffer;
414  fftw_plan p = fftw_data.plan;
415 
416  for (int i=2 ; i<nbr-1 ; i+=2)
417  tab_auxi[nbr-1-i/2] = -0.5*tab(i) ;
418  tab_auxi[0] = 0.5*tab(1) ;
419  for (int i=1 ; i<(nbr-1)/2 ; i++)
420  tab_auxi[i] = 0.25*(tab(2*i+1)-tab(2*i-1)) ;
421  tab_auxi[(nbr-1)/2] = -0.5*tab(nbr-2) ;
422 
423  fftw_data.execute() ;
424 
425  for (int i=1 ; i<(nbr-1)/2 ; i++) {
426  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
427  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i]) ;
428  tab.set(i) = fp+fm ;
429  tab.set(nbr-i-1) = fp -fm ;
430  }
431  tab.set(0) = 0 ;
432  tab.set(nbr-1) =-2* tab_auxi[0] ;
433  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2] ;
434  }
435 }
436 
437 void coef_i_1d_sin_odd (Array<double>& tab) {
438 
439  assert (tab.get_ndim()==1) ;
440  int nbr = tab.get_size(0) ;
441  if (nbr>3) {
442  double* ti = new double[nbr] ;
443  double* cf = new double[nbr] ;
444 
445  auto & fftw_data = coef_i_1d_fftw(nbr-1);
446  double* tab_auxi = fftw_data.buffer;
447  fftw_plan p = fftw_data.plan;
448 
449  ti[0] = 0.5*tab(0) ;
450  for (int i=1 ; i<nbr-1 ; i++)
451  ti[i] = 0.5*(tab(i)-tab(i-1)) ;
452  ti[nbr-1] = -0.5*tab(nbr-2) ;
453 
454  double c1 = ti[1] ;
455  double somme = 0 ;
456  cf[1] = 0 ;
457  for (int i=3 ; i<nbr ; i+=2) {
458  cf[i] = ti[i] - c1 ;
459  somme += cf[i] ;
460  }
461  double fmoins0 = (nbr-1)/2 *c1+ somme ;
462  for (int i=3 ; i<nbr ; i+=2)
463  tab_auxi[nbr-1-i/2] = 0.25*(cf[i]-cf[i-2]) ;
464  tab_auxi[0] = ti[0] ;
465  for (int i=1 ; i<(nbr-1)/2 ; i++)
466  tab_auxi[i] = 0.5*ti[2*i] ;
467  tab_auxi[(nbr-1)/2] = ti[nbr-1] ;
468 
469  fftw_data.execute() ;
470 
471  for (int i=1 ; i<(nbr-1)/2 ; i++) {
472  double fp = 0.5*(tab_auxi[i]+tab_auxi[nbr-1-i]) ;
473  double fm = 0.5*(tab_auxi[i]-tab_auxi[nbr-1-i])/sin(M_PI*i/(nbr-1)) ;
474  tab.set(i) = (fp+fm)/sin(M_PI*i/2/(nbr-1)) ;
475  tab.set(nbr-i-1) = (fp -fm)/sin(M_PI*(nbr-1-i)/2/(nbr-1)) ;
476  }
477  tab.set(0) = 0 ;
478  tab.set(nbr-1) = tab_auxi[0] - fmoins0 ;
479  tab.set((nbr-1)/2) = tab_auxi[(nbr-1)/2]/sin(M_PI*(nbr-1)/4/(nbr-1)) ;
480 
481  delete [] ti;
482  delete [] cf ;
483  }
484 }
485 
486 
487 void coef_i_1d_cossin_even (Array<double>& tab) {
488 
489  assert (tab.get_ndim()==1) ;
490  int nbr = tab.get_size(0) ;
491  // Double-sized array :
492  Array<double> tab2 (nbr*2-2) ;
493  int conte = 0 ;
494  for (int i=0 ; i<nbr-2 ; i+=2) {
495  tab2.set(conte) = tab(i) ;
496  tab2.set(conte+1) = tab(i+1) ;
497  tab2.set(conte+2) = 0. ;
498  tab2.set(conte+3) = 0. ;
499  conte += 4 ;
500  }
501  tab2.set(conte) = tab(nbr-2) ;
502  tab2.set(conte+1) = tab(nbr-1) ;
503 
504  coef_i_1d_cossin(tab2) ;
505  for (int i=0 ; i<nbr-2 ; i++)
506  tab.set(i) = tab2(i) ;
507  tab.set(nbr-2) = 0 ;
508  tab.set(nbr-1) = 0 ;
509 }
510 
511 
512 void coef_i_1d_cossin_odd (Array<double>& tab) {
513 
514  assert (tab.get_ndim()==1) ;
515  int nbr = tab.get_size(0) ;
516  // Double-sized array :
517  Array<double> tab2 (nbr*2-2) ;
518  int conte = 0 ;
519  for (int i=0 ; i<nbr-2 ; i+=2) {
520  tab2.set(conte) = 0. ;
521  tab2.set(conte+1) = 0. ;
522  tab2.set(conte+2) = tab(i) ;
523  tab2.set(conte+3) = tab(i+1) ;
524  conte += 4 ;
525  }
526  tab2.set(conte) = tab(nbr-2) ;
527  tab2.set(conte+1) = tab(nbr-1) ;
528 
529  coef_i_1d_cossin(tab2) ;
530  for (int i=0 ; i<nbr-2 ; i++)
531  tab.set(i) = tab2(i) ;
532  tab.set(nbr-2) = 0 ;
533  tab.set(nbr-1) = 0 ;
534 }
535 
536 
537 void coef_i_1d (int base, Array<double>& tab) {
538  static void (*coef_i_1d[NBR_MAX_BASE])(Array<double>&) ;
539  static bool premier_appel = true ;
540 
541  // Premier appel
542  if (premier_appel) {
543  premier_appel = false ;
544 
545  for (int i=0; i<NBR_MAX_BASE; i++)
546  coef_i_1d[i] = coef_i_1d_pasprevu ;
547 
548  coef_i_1d[CHEB] = coef_i_1d_cheb ;
549  coef_i_1d[CHEB_EVEN] = coef_i_1d_cheb_even ;
550  coef_i_1d[CHEB_ODD] = coef_i_1d_cheb_odd ;
551  coef_i_1d[COSSIN] = coef_i_1d_cossin ;
552  coef_i_1d[COS_EVEN] = coef_i_1d_cos_even ;
553  coef_i_1d[COS_ODD] = coef_i_1d_cos_odd ;
554  coef_i_1d[SIN_EVEN] = coef_i_1d_sin_even ;
555  coef_i_1d[SIN_ODD] = coef_i_1d_sin_odd ;
556  coef_i_1d[COS] = coef_i_1d_cos ;
557  coef_i_1d[SIN] = coef_i_1d_sin ;
558  coef_i_1d[LEG] = coef_i_1d_leg ;
559  coef_i_1d[LEG_EVEN] = coef_i_1d_leg_even ;
560  coef_i_1d[LEG_ODD] = coef_i_1d_leg_odd;
561  coef_i_1d[COSSIN_EVEN] = coef_i_1d_cossin_even ;
562  coef_i_1d[COSSIN_ODD] = coef_i_1d_cossin_odd ;
563  }
564 
565  coef_i_1d[base](tab) ;
566 }
567 }
568