20 #include "base_spectral.hpp"
21 #include "headcpp.hpp"
23 #include "array_math.hpp"
25 int der_1d_pasprevu (Array<double>&) {
26 cout <<
"Der_1d not implemented." << endl ;
31 int der_1d_cheb (Array<double>& tab) {
33 assert (tab.get_ndim()==1) ;
34 int nr = tab.get_size(0) ;
36 Array<double> res (nr) ;
38 for (
int i=0 ;i<nr ; i++)
39 for (
int p=i+1 ; p<nr ; p+=2)
40 res.set(i) += p*tab(p) ;
50 int der_1d_cheb_even (Array<double>& tab) {
52 assert (tab.get_ndim()==1) ;
53 int nr = tab.get_size(0) ;
54 Array<double> res (nr) ;
56 for (
int i=0 ;i<nr ; i++)
57 for (
int p=i+1 ; p<nr ; p++)
58 res.set(i) += 2*p*tab(p) ;
68 int der_1d_cheb_odd (Array<double>& tab) {
70 assert (tab.get_ndim()==1) ;
71 int nr = tab.get_size(0) ;
72 Array<double> res (nr) ;
74 for (
int i=0 ;i<nr ; i++)
75 for (
int p=i ; p<nr ; p++)
76 res.set(i) += (2*p+1)*tab(p) ;
86 int der_1d_leg (Array<double>& tab) {
88 assert (tab.get_ndim()==1) ;
89 int nr = tab.get_size(0) ;
90 Array<double> res (nr) ;
92 for (
int i=0 ;i<nr ; i++)
93 for (
int p=i+1 ; p<nr ; p+=2)
94 res.set(i) += (2*i+1)*tab(p) ;
101 int der_1d_leg_even (Array<double>& tab) {
103 assert (tab.get_ndim()==1) ;
104 int nr = tab.get_size(0) ;
105 Array<double> res (nr) ;
107 for (
int i=0 ;i<nr ; i++)
108 for (
int p=i+1 ; p<nr ; p++)
109 res.set(i) += (4*i+3)*tab(p) ;
118 int der_1d_leg_odd (Array<double>& tab) {
120 assert (tab.get_ndim()==1) ;
121 int nr = tab.get_size(0) ;
122 Array<double> res (nr) ;
124 for (
int i=0 ;i<nr ; i++)
125 for (
int p=i ; p<nr ; p++)
126 res.set(i) += (4*i+1)*tab(p) ;
134 int der_1d_cossin (Array<double>& tab) {
136 assert (tab.get_ndim()==1) ;
137 int nr = tab.get_size(0) ;
138 Array<double> res (nr) ;
140 for (
int i=0 ;i<nr-1 ; i+=2)
141 res.set(i+1) = - (i/2)*tab(i) ;
143 for (
int i=1 ;i<nr ; i+=2)
144 res.set(i-1) = ((i-1)/2)*tab(i) ;
153 int der_1d_cossin_even (Array<double>& tab) {
155 assert (tab.get_ndim()==1) ;
156 int nr = tab.get_size(0) ;
157 Array<double> res (nr) ;
159 for (
int i=0 ;i<nr-1 ; i+=2)
160 res.set(i+1) = - i*tab(i) ;
162 for (
int i=1 ;i<nr ; i+=2)
163 res.set(i-1) = (i-1)*tab(i) ;
171 int der_1d_cossin_odd (Array<double>& tab) {
173 assert (tab.get_ndim()==1) ;
174 int nr = tab.get_size(0) ;
175 Array<double> res (nr) ;
177 for (
int i=0 ;i<nr-1 ; i+=2)
178 res.set(i+1) = - (i+1)*tab(i) ;
180 for (
int i=1 ;i<nr ; i+=2)
181 res.set(i-1) = i*tab(i) ;
189 int der_1d_cos (Array<double>& tab) {
191 assert (tab.get_ndim()==1) ;
192 int nr = tab.get_size(0) ;
193 Array<double> res (nr) ;
195 for (
int i=0 ;i<nr ; i++)
196 res.set(i) = - i*tab(i) ;
205 int der_1d_sin(Array<double>& tab) {
207 assert (tab.get_ndim()==1) ;
208 int nr = tab.get_size(0) ;
209 Array<double> res (nr) ;
211 for (
int i=0 ;i<nr ; i++)
212 res.set(i) = i*tab(i) ;
222 int der_1d_cos_even (Array<double>& tab) {
224 assert (tab.get_ndim()==1) ;
225 int nr = tab.get_size(0) ;
226 Array<double> res (nr) ;
228 for (
int i=0 ;i<nr ; i++)
229 res.set(i) = -2*i*tab(i) ;
239 int der_1d_cos_odd (Array<double>& tab) {
241 assert (tab.get_ndim()==1) ;
242 int nr = tab.get_size(0) ;
243 Array<double> res (nr) ;
245 for (
int i=0 ;i<nr ; i++)
246 res.set(i) = -(2*i+1)*tab(i) ;
257 int der_1d_sin_even (Array<double>& tab) {
259 assert (tab.get_ndim()==1) ;
260 int nr = tab.get_size(0) ;
261 Array<double> res (nr) ;
263 for (
int i=0 ;i<nr ; i++)
264 res.set(i) = 2*i*tab(i) ;
273 int der_1d_sin_odd (Array<double>& tab) {
275 assert (tab.get_ndim()==1) ;
276 int nr = tab.get_size(0) ;
277 Array<double> res (nr) ;
279 for (
int i=0 ;i<nr ; i++)
280 res.set(i) = (2*i+1)*tab(i) ;
290 int der_1d (
int base, Array<double>& tab) {
291 static int (*der_1d[NBR_MAX_BASE])(Array<double>&) ;
292 static bool premier_appel = true ;
296 premier_appel = false ;
298 for (
int i=0; i<NBR_MAX_BASE; i++)
299 der_1d[i] = der_1d_pasprevu ;
301 der_1d[CHEB] = der_1d_cheb ;
302 der_1d[CHEB_EVEN] = der_1d_cheb_even ;
303 der_1d[CHEB_ODD] = der_1d_cheb_odd ;
304 der_1d[COSSIN] = der_1d_cossin ;
305 der_1d[COS_EVEN] = der_1d_cos_even ;
306 der_1d[COS_ODD] = der_1d_cos_odd ;
307 der_1d[SIN_EVEN] = der_1d_sin_even ;
308 der_1d[SIN_ODD] = der_1d_sin_odd ;
309 der_1d[COS] = der_1d_cos ;
310 der_1d[SIN] = der_1d_sin ;
311 der_1d[LEG] = der_1d_leg ;
312 der_1d[LEG_EVEN] = der_1d_leg_even ;
313 der_1d[LEG_ODD] = der_1d_leg_odd;
314 der_1d[COSSIN_EVEN] = der_1d_cossin_even ;
315 der_1d[COSSIN_ODD] = der_1d_cossin_odd ;
318 return der_1d[base](tab) ;