20 #include "base_spectral.hpp"
21 #include "headcpp.hpp"
22 #include "matrice.hpp"
25 int mult_x_1d_pasprevu (Array<double>&) {
26 cout <<
"mult_x_1d not implemented." << endl ;
30 int mult_x_1d_cheb (Array<double>& so) {
31 assert (so.get_ndim()==1) ;
32 int nr = so.get_size(0) ;
33 Array<double> res (nr) ;
34 res.set(0) = 0.5*so(1) ;
35 res.set(1) = so(0)+0.5*so(2) ;
36 for (
int i=2 ; i<nr-1 ; i++)
37 res.set(i) = 0.5*(so(i+1)+so(i-1)) ;
38 res.set(nr-1) = 0.5*so(nr-2) ;
43 int mult_x_1d_cheb_even (Array<double>& so) {
44 assert (so.get_ndim()==1) ;
45 int nr = so.get_size(0) ;
46 Array<double> res (nr) ;
48 res.set(0) = so(0) + 0.5*so(1) ;
49 for (
int i=1 ; i<nr-1 ; i++)
50 res.set(i) = 0.5*(so(i)+so(i+1)) ;
57 int mult_x_1d_cheb_odd (Array<double>& so) {
58 assert (so.get_ndim()==1) ;
59 int nr = so.get_size(0) ;
60 Array<double> res (nr) ;
61 res.set(0) = 0.5*so(0) ;
62 for (
int i=1 ; i<nr-1 ; i++)
63 res.set(i) = 0.5*(so(i)+so(i-1)) ;
64 res.set(nr-1) = 0.5*so(nr-2) ;
70 int mult_x_1d_leg (Array<double>& so) {
71 assert (so.get_ndim()==1) ;
72 int nr = so.get_size(0) ;
73 Array<double> res (nr) ;
74 res.set(0) = 1./3.*so(1) ;
75 for (
int i=1 ; i<nr-1 ; i++)
76 res.set(i) = (double(i)/double(2*i-1)*so(i-1)+double(i+1)/double(2*i+3)*so(i+1)) ;
77 res.set(nr-1) = double(nr-1)/double(2*nr-3)*so(nr-2);
82 int mult_x_1d_leg_odd (Array<double>& so) {
83 assert (so.get_ndim()==1) ;
84 int nr = so.get_size(0) ;
85 Array<double> res (nr) ;
87 res.set(0) = 1./3.*so(0) ;
88 for (
int i=1 ; i<nr-1 ; i++)
89 res.set(i) = (double(2*i)/double(4*i-1)*so(i-1)+double(2*i+1)/double(4*i+3)*so(i)) ;
90 res.set(nr-1) = double(2*nr-2)/double(4*nr-5)*so(nr-2);
96 int mult_x_1d_leg_even (Array<double>& so) {
97 assert (so.get_ndim()==1) ;
98 int nr = so.get_size(0) ;
99 Array<double> res (nr) ;
100 for (
int i=0 ; i<nr-1 ; i++)
101 res.set(i) = (double(2*i+1)/double(4*i+1)*so(i)+double(2*i+2)/double(4*i+5)*so(i+1)) ;
108 int mult_x_1d (
int base, Array<double>& so) {
109 static int (*mult_x_1d[NBR_MAX_BASE])(Array<double>&) ;
110 static bool premier_appel = true ;
114 premier_appel = false ;
116 for (
int i=0; i<NBR_MAX_BASE; i++)
117 mult_x_1d[i] = mult_x_1d_pasprevu ;
119 mult_x_1d[CHEB_EVEN] = mult_x_1d_cheb_even ;
120 mult_x_1d[CHEB] = mult_x_1d_cheb ;
121 mult_x_1d[CHEB_ODD] = mult_x_1d_cheb_odd ;
122 mult_x_1d[LEG_EVEN] = mult_x_1d_leg_even ;
123 mult_x_1d[LEG_ODD] = mult_x_1d_leg_odd ;
124 mult_x_1d[LEG] = mult_x_1d_leg ;
127 return mult_x_1d[base](so) ;