20 #include "base_spectral.hpp"
21 #include "headcpp.hpp"
24 int mult_sin_1d_pasprevu (Array<double>&) {
25 cout <<
"mult_sin_1d not implemented." << endl ;
29 int mult_sin_1d_cossin (Array<double>& tab) {
30 assert (tab.get_ndim()==1) ;
31 int nr = tab.get_size(0) ;
33 Array<double> res (nr) ;
35 res.set(0) = 0.5*tab(3) ;
37 res.set(2) = 0.5*tab(5) ;
38 res.set(3) = tab(0) - 0.5*tab(4) ;
39 for (
int k=4; k<nr-2; k+=2) {
41 res.set(k) = 0.5*(tab(3+k) - tab(k-1)) ;
43 res.set(k+1) = 0.5*(tab(k-2) - tab(k+2)) ;
46 res.set(nr-2) = -0.5*tab(nr-3) ;
53 int mult_sin_1d_cos (Array<double>& tab) {
54 assert (tab.get_ndim()==1) ;
55 int nr = tab.get_size(0) ;
57 Array<double> res (nr) ;
60 res.set(1) = tab(0) - 0.5*tab(2) ;
61 for (
int k=2; k<nr-1; k++)
63 res.set(k) = 0.5*(tab(k-1) - tab(k+1)) ;
71 int mult_sin_1d_sin (Array<double>& tab) {
72 assert (tab.get_ndim()==1) ;
73 int nr = tab.get_size(0) ;
75 Array<double> res (nr) ;
77 res.set(0) = 0.5*tab(1) ;
78 res.set(1) = 0.5*tab(2) ;
79 for (
int k=2; k<nr-1; k++)
81 res.set(k) = 0.5*(-tab(k-1) + tab(k+1)) ;
89 int mult_sin_1d_cos_even (Array<double>& tab) {
90 assert (tab.get_ndim()==1) ;
91 int nr = tab.get_size(0) ;
93 Array<double> res (nr) ;
95 res.set(0) = tab(0) - 0.5*tab(1) ;
96 for (
int k=1; k<nr-1; k++)
98 res.set(k) = 0.5*(tab(k) - tab(k+1)) ;
106 int mult_sin_1d_cos_odd (Array<double>& tab) {
107 assert (tab.get_ndim()==1) ;
108 int nr = tab.get_size(0) ;
110 Array<double> res (nr) ;
113 for (
int k=1; k<nr; k++)
115 res.set(k) = 0.5*(tab(k-1) - tab(k)) ;
121 int mult_sin_1d_sin_even (Array<double>& tab) {
122 assert (tab.get_ndim()==1) ;
123 int nr = tab.get_size(0) ;
125 Array<double> res (nr) ;
127 res.set(0) = 0.5*tab(1) ;
128 for (
int k=1; k<nr-1; k++)
130 res.set(k) = 0.5*(-tab(k) + tab(k+1)) ;
138 int mult_sin_1d_sin_odd (Array<double>& tab) {
139 assert (tab.get_ndim()==1) ;
140 int nr = tab.get_size(0) ;
142 Array<double> res (nr) ;
144 res.set(0) = 0.5*tab(0) ;
145 for (
int k=1; k<nr ; k++)
147 res.set(k) = 0.5*(-tab(k-1) + tab(k)) ;
153 int mult_sin_1d (
int base, Array<double>& tab) {
154 static int (*mult_sin_1d[NBR_MAX_BASE])(Array<double>&) ;
155 static bool premier_appel = true ;
159 premier_appel = false ;
161 for (
int i=0; i<NBR_MAX_BASE; i++)
162 mult_sin_1d[i] = mult_sin_1d_pasprevu ;
164 mult_sin_1d[COSSIN] = mult_sin_1d_cossin ;
165 mult_sin_1d[COS_EVEN] = mult_sin_1d_cos_even ;
166 mult_sin_1d[COS_ODD] = mult_sin_1d_cos_odd ;
167 mult_sin_1d[SIN_EVEN] = mult_sin_1d_sin_even ;
168 mult_sin_1d[SIN_ODD] = mult_sin_1d_sin_odd ;
169 mult_sin_1d[COS] = mult_sin_1d_cos ;
170 mult_sin_1d[SIN] = mult_sin_1d_sin ;
173 return mult_sin_1d[base](tab) ;