20 #include "headcpp.hpp"
21 #include "base_spectral.hpp"
22 #include "matrice.hpp"
25 int div_x_1d_pasprevu (Array<double>&) {
26 cout <<
"div_x_1d not implemented." << endl ;
31 int div_x_1d_cheb_even (Array<double>& so) {
32 assert (so.get_ndim()==1) ;
33 int nr = so.get_size(0) ;
34 Array<double> res (nr) ;
38 double somme = 2*sgn*so(nr-1) ;
39 res.set(nr-2) = somme ;
40 for (
int i=nr-3 ; i>=0 ; i--) {
42 somme += 2*sgn*so(i+1) ;
45 for (
int i=0 ; i<nr ; i+=2)
52 int div_x_1d_cheb_odd (Array<double>& so) {
53 assert (so.get_ndim()==1) ;
54 int nr = so.get_size(0) ;
55 Array<double> res (nr) ;
59 double somme = 2*sgn*so(nr-2) ;
60 res.set(nr-2) = somme ;
61 for (
int i=nr-3 ; i>=0 ; i--) {
63 somme += 2*sgn*so(i) ;
66 for (
int i=0 ; i<nr ; i+=2)
74 int div_x_1d_leg_odd (Array<double>& so) {
75 assert (so.get_ndim()==1) ;
76 int nr = so.get_size(0) ;
77 Array<double> res (nr) ;
80 for (
int i=0 ; i<nr ; i++) {
81 coef = double(4*i+1)/double(2*i+1) ;
82 res.set(i) = coef * so(i) ;
83 for (
int j=i+1 ; j<nr ; j++) {
84 coef *= -double(2*j)/double(2*j+1) ;
85 res.set(i) += coef*so(j) ;
93 int div_x_1d_leg_even (Array<double>& so) {
94 assert (so.get_ndim()==1) ;
95 int nr = so.get_size(0) ;
96 Array<double> res (nr) ;
100 for (
int i=0 ; i<nr-1 ; i++) {
101 coef = double(4*i+3)/double(2*i+2) ;
102 res.set(i) = coef * so(i+1) ;
103 for (
int j=i+2 ; j<nr ; j++) {
104 coef *= -double(2*j-1)/double(2*j) ;
105 res.set(i) += coef*so(j) ;
113 int div_x_1d (
int base, Array<double>& so) {
114 static int (*div_x_1d[NBR_MAX_BASE])(Array<double>&) ;
115 static bool premier_appel = true ;
119 premier_appel = false ;
121 for (
int i=0; i<NBR_MAX_BASE; i++)
122 div_x_1d[i] = div_x_1d_pasprevu ;
124 div_x_1d[CHEB_EVEN] = div_x_1d_cheb_even ;
125 div_x_1d[CHEB_ODD] = div_x_1d_cheb_odd ;
126 div_x_1d[LEG_EVEN] = div_x_1d_leg_even ;
127 div_x_1d[LEG_ODD] = div_x_1d_leg_odd ;
130 return div_x_1d[base](so) ;