55 #include "type_parite.h" 79 Matrice _ope_pvect_r_mat_pas_prevu(
int,
int,
double,
int) ;
80 Matrice _ope_pvect_r_mat_r_chebp(
int,
int,
double,
int) ;
81 Matrice _ope_pvect_r_mat_r_chebi(
int,
int,
double,
int) ;
82 Matrice _ope_pvect_r_mat_r_chebu(
int,
int,
double,
int) ;
83 Matrice _ope_pvect_r_mat_r_cheb(
int,
int,
double,
int) ;
89 Matrice _ope_pvect_r_mat_pas_prevu(
int n,
int l,
double echelle,
int puis) {
90 cout <<
"laplacien vect_r pas prevu..." << endl ;
91 cout <<
"n : " << n << endl ;
92 cout <<
"l : " << l << endl ;
93 cout <<
"puissance : " << puis << endl ;
94 cout <<
"echelle : " << echelle << endl ;
107 Matrice _ope_pvect_r_mat_r_chebp (
int n,
int l,
double,
int) {
109 const int nmax = 100 ;
110 static Matrice* tab[nmax] ;
111 static int nb_dejafait = 0 ;
112 static int l_dejafait[nmax] ;
113 static int nr_dejafait[nmax] ;
118 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
119 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
124 if (nb_dejafait >= nmax) {
125 cout <<
"_ope_pvect_r_mat_r_chebp : trop de matrices" << endl ;
131 l_dejafait[nb_dejafait] = l ;
132 nr_dejafait[nb_dejafait] = n ;
141 double* vect =
new double[n] ;
143 for (
int i=0 ; i<n ; i++) {
144 for (
int j=0 ; j<n ; j++)
147 d2sdx2_1d (n, &vect,
R_CHEBP) ;
149 for (
int j=0 ; j<n ; j++)
150 dd.set(j, i) = vect[j] ;
153 for (
int i=0 ; i<n ; i++) {
154 for (
int j=0 ; j<n ; j++)
157 sxdsdx_1d (n, &vect,
R_CHEBP) ;
158 for (
int j=0 ; j<n ; j++)
159 xd.set(j, i) = vect[j] ;
163 for (
int i=0 ; i<n ; i++) {
164 for (
int j=0 ; j<n ; j++)
168 for (
int j=0 ; j<n ; j++)
169 xx.set(j, i) = vect[j] ;
176 res = dd+4*xd+(2-l*(l+1))*xx ;
178 res = dd + 2*xd - 2*xx ;
179 tab[nb_dejafait] =
new Matrice(res) ;
186 return *tab[indice] ;
196 Matrice _ope_pvect_r_mat_r_chebi (
int n,
int l,
double,
int) {
198 const int nmax = 100 ;
199 static Matrice* tab[nmax] ;
200 static int nb_dejafait = 0 ;
201 static int l_dejafait[nmax] ;
202 static int nr_dejafait[nmax] ;
207 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
208 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
213 if (nb_dejafait >= nmax) {
214 cout <<
"_ope_pvect_r_mat_r_chebi : trop de matrices" << endl ;
220 l_dejafait[nb_dejafait] = l ;
221 nr_dejafait[nb_dejafait] = n ;
230 double* vect =
new double[n] ;
232 for (
int i=0 ; i<n ; i++) {
233 for (
int j=0 ; j<n ; j++)
236 d2sdx2_1d (n, &vect,
R_CHEBI) ;
237 for (
int j=0 ; j<n ; j++)
238 dd.set(j, i) = vect[j] ;
241 for (
int i=0 ; i<n ; i++) {
242 for (
int j=0 ; j<n ; j++)
245 sxdsdx_1d (n, &vect,
R_CHEBI) ;
246 for (
int j=0 ; j<n ; j++)
247 xd.set(j, i) = vect[j] ;
250 for (
int i=0 ; i<n ; i++) {
251 for (
int j=0 ; j<n ; j++)
255 for (
int j=0 ; j<n ; j++)
256 xx.set(j, i) = vect[j] ;
263 res = dd+4*xd+(2-l*(l+1))*xx ;
265 res = dd + 2*xd - 2*xx ;
266 tab[nb_dejafait] =
new Matrice(res) ;
273 return *tab[indice] ;
283 Matrice _ope_pvect_r_mat_r_chebu(
int n,
int l,
double,
int puis) {
286 cout <<
"_ope_pvect_r_mat_r_chebu : only the case dzpuis = 4 " 287 <<
'\n' <<
"is implemented! \n" 288 <<
"dzpuis = " << puis << endl ;
292 const int nmax = 200 ;
293 static Matrice* tab[nmax] ;
294 static int nb_dejafait = 0 ;
295 static int l_dejafait[nmax] ;
296 static int nr_dejafait[nmax] ;
301 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
302 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
307 if (nb_dejafait >= nmax) {
308 cout <<
"_ope_pvect_r_mat_r_chebu : trop de matrices" << endl ;
313 l_dejafait[nb_dejafait] = l ;
314 nr_dejafait[nb_dejafait] = n ;
323 double* vect =
new double[n] ;
325 for (
int i=0 ; i<n ; i++) {
326 for (
int j=0 ; j<n ; j++)
329 d2sdx2_1d (n, &vect,
R_CHEBU) ;
330 for (
int j=0 ; j<n ; j++)
331 dd.set(j, i) = vect[j] ;
334 for (
int i=0 ; i<n ; i++) {
335 for (
int j=0 ; j<n ; j++)
339 sxm1_1d_cheb (n, vect) ;
340 for (
int j=0 ; j<n ; j++)
341 xd.set(j, i) = vect[j] ;
344 for (
int i=0 ; i<n ; i++) {
345 for (
int j=0 ; j<n ; j++)
349 for (
int j=0 ; j<n ; j++)
350 xx.set(j, i) = vect[j] ;
359 res = dd - 2*xd + (2 -l*(l+1))*xx ;
360 tab[nb_dejafait] =
new Matrice(res) ;
367 return *tab[indice] ;
376 Matrice _ope_pvect_r_mat_r_cheb (
int n,
int l,
double echelle,
int) {
378 const int nmax = 200 ;
379 static Matrice* tab[nmax] ;
380 static int nb_dejafait = 0 ;
381 static int l_dejafait[nmax] ;
382 static int nr_dejafait[nmax] ;
383 static double vieux_echelle = 0;
386 if (vieux_echelle != echelle) {
387 for (
int i=0 ; i<nb_dejafait ; i++) {
389 nr_dejafait[i] = -1 ;
394 vieux_echelle = echelle ;
400 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
401 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
406 if (nb_dejafait >= nmax) {
407 cout <<
"_ope_pvect_r_mat_r_cheb : trop de matrices" << endl ;
413 l_dejafait[nb_dejafait] = l ;
414 nr_dejafait[nb_dejafait] = n ;
423 double* vect =
new double[n] ;
425 for (
int i=0 ; i<n ; i++) {
426 for (
int j=0 ; j<n ; j++)
429 d2sdx2_1d (n, &vect,
R_CHEB) ;
430 for (
int j=0 ; j<n ; j++)
431 dd.set(j, i) = vect[j]*echelle*echelle ;
434 for (
int i=0 ; i<n ; i++) {
435 for (
int j=0 ; j<n ; j++)
438 d2sdx2_1d (n, &vect,
R_CHEB) ;
439 multx_1d (n, &vect,
R_CHEB) ;
440 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
441 dd.set(j, i) += 2*echelle*vect[j] ;
444 for (
int i=0 ; i<n ; i++) {
445 for (
int j=0 ; j<n ; j++)
448 d2sdx2_1d (n, &vect,
R_CHEB) ;
449 multx_1d (n, &vect,
R_CHEB) ;
450 multx_1d (n, &vect,
R_CHEB) ;
451 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
452 dd.set(j, i) += vect[j] ;
455 for (
int i=0 ; i<n ; i++) {
456 for (
int j=0 ; j<n ; j++)
459 sxdsdx_1d (n, &vect,
R_CHEB) ;
460 for (
int j=0 ; j<n ; j++)
461 xd.set(j, i) = vect[j]*echelle ;
464 for (
int i=0 ; i<n ; i++) {
465 for (
int j=0 ; j<n ; j++)
468 sxdsdx_1d (n, &vect,
R_CHEB) ;
469 multx_1d (n, &vect,
R_CHEB) ;
470 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
471 xd.set(j, i) += vect[j] ;
474 for (
int i=0 ; i<n ; i++) {
475 for (
int j=0 ; j<n ; j++)
478 sx2_1d (n, &vect,
R_CHEB) ;
479 for (
int j=0 ; j<n ; j++)
480 xx.set(j, i) = vect[j] ;
489 res = dd + 4*xd + (2 - l*(l+1))*xx ;
490 tab[nb_dejafait] =
new Matrice(res) ;
497 return *tab[indice] ;
505 Matrice ope_pvect_r_mat(
int n,
int l,
double echelle,
int puis,
int base_r)
509 static Matrice (*ope_pvect_r_mat[
MAX_BASE])(int, int, double, int) ;
516 ope_pvect_r_mat[i] = _ope_pvect_r_mat_pas_prevu ;
519 ope_pvect_r_mat[
R_CHEB >>
TRA_R] = _ope_pvect_r_mat_r_cheb ;
520 ope_pvect_r_mat[
R_CHEBU >>
TRA_R] = _ope_pvect_r_mat_r_chebu ;
521 ope_pvect_r_mat[
R_CHEBP >>
TRA_R] = _ope_pvect_r_mat_r_chebp ;
522 ope_pvect_r_mat[
R_CHEBI >>
TRA_R] = _ope_pvect_r_mat_r_chebi ;
525 Matrice res(ope_pvect_r_mat[base_r](n, l, echelle, puis)) ;
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
#define MAX_BASE
Nombre max. de bases differentes.
#define R_CHEB
base de Chebychev ordinaire (fin)