32 #include "ope_elementary.h" 39 Matrice _poisson_2d_mat_pas_prevu(
int,
int,
double,
double,
int) {
40 cout <<
"laplacien pas prevu..." << endl ;
53 Matrice _poisson_2d_mat_r_chebp (
int n,
int l,
double,
double,
int) {
55 const int nmax = 100 ;
56 static Matrice* tab[nmax] ;
57 static int nb_dejafait = 0 ;
58 static int l_dejafait[nmax] ;
59 static int nr_dejafait[nmax] ;
64 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
65 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
70 if (nb_dejafait >= nmax) {
71 cout <<
"_poisson_2d_mat_r_chebp : trop de matrices" << endl ;
77 l_dejafait[nb_dejafait] = l ;
78 nr_dejafait[nb_dejafait] = n ;
87 double* vect =
new double[n] ;
89 for (
int i=0 ; i<n ; i++) {
90 for (
int j=0 ; j<n ; j++)
95 for (
int j=0 ; j<n ; j++)
96 dd.set(j, i) = vect[j] ;
99 for (
int i=0 ; i<n ; i++) {
100 for (
int j=0 ; j<n ; j++)
103 sxdsdx_1d (n, &vect,
R_CHEBP) ;
104 for (
int j=0 ; j<n ; j++)
105 xd.set(j, i) = vect[j] ;
109 for (
int i=0 ; i<n ; i++) {
110 for (
int j=0 ; j<n ; j++)
114 for (
int j=0 ; j<n ; j++)
115 xx.set(j, i) = vect[j] ;
122 tab[nb_dejafait] =
new Matrice(res) ;
129 return *tab[indice] ;
139 Matrice _poisson_2d_mat_r_chebi (
int n,
int l,
double,
double,
int) {
141 const int nmax = 100 ;
142 static Matrice* tab[nmax] ;
143 static int nb_dejafait = 0 ;
144 static int l_dejafait[nmax] ;
145 static int nr_dejafait[nmax] ;
150 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
151 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
156 if (nb_dejafait >= nmax) {
157 cout <<
"_poisson_2d_mat_r_chebi : trop de matrices" << endl ;
163 l_dejafait[nb_dejafait] = l ;
164 nr_dejafait[nb_dejafait] = n ;
173 double* vect =
new double[n] ;
175 for (
int i=0 ; i<n ; i++) {
176 for (
int j=0 ; j<n ; j++)
179 d2sdx2_1d (n, &vect,
R_CHEBI) ;
180 for (
int j=0 ; j<n ; j++)
181 dd.set(j, i) = vect[j] ;
184 for (
int i=0 ; i<n ; i++) {
185 for (
int j=0 ; j<n ; j++)
188 sxdsdx_1d (n, &vect,
R_CHEBI) ;
189 for (
int j=0 ; j<n ; j++)
190 xd.set(j, i) = vect[j] ;
193 for (
int i=0 ; i<n ; i++) {
194 for (
int j=0 ; j<n ; j++)
198 for (
int j=0 ; j<n ; j++)
199 xx.set(j, i) = vect[j] ;
206 tab[nb_dejafait] =
new Matrice(res) ;
213 return *tab[indice] ;
223 Matrice _poisson_2d_mat_r_chebu_deux(
int,
int) ;
224 Matrice _poisson_2d_mat_r_chebu_trois(
int,
int) ;
225 Matrice _poisson_2d_mat_r_chebu_quatre(
int,
int) ;
227 Matrice _poisson_2d_mat_r_chebu(
int n,
int l,
double,
double,
int puis) {
232 res = _poisson_2d_mat_r_chebu_quatre (n, l) ;
235 res = _poisson_2d_mat_r_chebu_trois (n, l) ;
238 res = _poisson_2d_mat_r_chebu_deux (n, l) ;
248 Matrice _poisson_2d_mat_r_chebu_quatre (
int n,
int l) {
250 const int nmax = 200 ;
251 static Matrice* tab[nmax] ;
252 static int nb_dejafait = 0 ;
253 static int l_dejafait[nmax] ;
254 static int nr_dejafait[nmax] ;
259 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
260 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
265 if (nb_dejafait >= nmax) {
266 cout <<
"_poisson_2d_mat_r_chebu_quatre : trop de matrices" << endl ;
272 l_dejafait[nb_dejafait] = l ;
273 nr_dejafait[nb_dejafait] = n ;
282 double* vect =
new double[n] ;
284 for (
int i=0 ; i<n ; i++) {
285 for (
int j=0 ; j<n ; j++)
288 d2sdx2_1d (n, &vect,
R_CHEBU) ;
289 for (
int j=0 ; j<n ; j++)
290 dd.set(j, i) = vect[j] ;
293 for (
int i=0 ; i<n ; i++) {
294 for (
int j=0 ; j<n ; j++)
297 sxdsdx_1d (n, &vect,
R_CHEBU) ;
298 for (
int j=0 ; j<n ; j++)
299 dx.set(j, i) = vect[j] ;
302 for (
int i=0 ; i<n ; i++) {
303 for (
int j=0 ; j<n ; j++)
307 for (
int j=0 ; j<n ; j++)
308 xx.set(j, i) = vect[j] ;
315 tab[nb_dejafait] =
new Matrice(res) ;
322 return *tab[indice] ;
326 Matrice _poisson_2d_mat_r_chebu_trois (
int n,
int l) {
328 const int nmax = 200 ;
329 static Matrice* tab[nmax] ;
330 static int nb_dejafait = 0 ;
331 static int l_dejafait[nmax] ;
332 static int nr_dejafait[nmax] ;
337 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
338 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
343 if (nb_dejafait >= nmax) {
344 cout <<
"_poisson_2d_mat_r_chebu_trois : trop de matrices" << endl ;
350 l_dejafait[nb_dejafait] = l ;
351 nr_dejafait[nb_dejafait] = n ;
360 double* vect =
new double[n] ;
361 double* auxi =
new double[n] ;
363 for (
int i=0 ; i<n ; i++) {
365 for (
int j=0 ; j<n ; j++)
368 d2sdx2_1d (n, &vect,
R_CHEBU) ;
369 mult_xm1_1d_cheb (n, vect, auxi) ;
370 for (
int j=0 ; j<n ; j++)
371 dd.set(j, i) = auxi[j] ;
374 for (
int i=0 ; i<n ; i++) {
375 for (
int j=0 ; j<n ; j++)
379 for (
int j=0 ; j<n ; j++)
380 dx.set(j, i) = vect[j] ;
384 for (
int i=0 ; i<n ; i++) {
385 for (
int j=0 ; j<n ; j++)
388 sxm1_1d_cheb (n, vect) ;
389 for (
int j=0 ; j<n ; j++)
390 xx.set(j, i) = vect[j] ;
398 tab[nb_dejafait] =
new Matrice(res) ;
405 return *tab[indice] ;
410 Matrice _poisson_2d_mat_r_chebu_deux (
int n,
int l) {
412 const int nmax = 200 ;
413 static Matrice* tab[nmax] ;
414 static int nb_dejafait = 0 ;
415 static int l_dejafait[nmax] ;
416 static int nr_dejafait[nmax] ;
421 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
422 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
427 if (nb_dejafait >= nmax) {
428 cout <<
"_poisson_2d_mat_r_chebu_deux : trop de matrices" << endl ;
434 l_dejafait[nb_dejafait] = l ;
435 nr_dejafait[nb_dejafait] = n ;
443 double* vect =
new double[n] ;
445 double* x2vect =
new double[n] ;
447 for (
int i=0 ; i<n ; i++) {
448 for (
int j=0 ; j<n ; j++)
451 d2sdx2_1d (n, &vect,
R_CHEBU) ;
452 mult2_xm1_1d_cheb (n, vect, x2vect) ;
453 for (
int j=0 ; j<n ; j++)
454 res.set(j, i) = x2vect[j] ;
457 for (
int i=0 ; i<n ; i++) {
458 for (
int j=0 ; j<n ; j++)
462 mult_xm1_1d_cheb (n, vect, x2vect) ;
463 for (
int j=0 ; j<n ; j++)
464 dx.set(j, i) = x2vect[j] ;
472 for (
int i=0 ; i<n ; i++)
473 res.set(i, i) -= l*l ;
475 tab[nb_dejafait] =
new Matrice(res) ;
482 return *tab[indice] ;
490 Matrice _poisson_2d_mat_r_cheb (
int n,
int l,
double alf,
double bet,
int) {
492 double echelle = bet / alf ;
494 const int nmax = 200 ;
495 static Matrice* tab[nmax] ;
496 static int nb_dejafait = 0 ;
497 static int l_dejafait[nmax] ;
498 static int nr_dejafait[nmax] ;
499 static double vieux_echelle = 0;
502 if (vieux_echelle != echelle) {
503 for (
int i=0 ; i<nb_dejafait ; i++) {
505 nr_dejafait[i] = -1 ;
510 vieux_echelle = echelle ;
516 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
517 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
522 if (nb_dejafait >= nmax) {
523 cout <<
"_poisson_2d_mat_r_cheb : trop de matrices" << endl ;
529 l_dejafait[nb_dejafait] = l ;
530 nr_dejafait[nb_dejafait] = n ;
539 double* vect =
new double[n] ;
541 for (
int i=0 ; i<n ; i++) {
542 for (
int j=0 ; j<n ; j++)
545 d2sdx2_1d (n, &vect,
R_CHEB) ;
546 for (
int j=0 ; j<n ; j++)
547 dd.set(j, i) = vect[j]*echelle*echelle ;
550 for (
int i=0 ; i<n ; i++) {
551 for (
int j=0 ; j<n ; j++)
554 d2sdx2_1d (n, &vect,
R_CHEB) ;
555 multx_1d (n, &vect,
R_CHEB) ;
556 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
557 dd.set(j, i) += 2*echelle*vect[j] ;
560 for (
int i=0 ; i<n ; i++) {
561 for (
int j=0 ; j<n ; j++)
564 d2sdx2_1d (n, &vect,
R_CHEB) ;
565 multx_1d (n, &vect,
R_CHEB) ;
566 multx_1d (n, &vect,
R_CHEB) ;
567 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
568 dd.set(j, i) += vect[j] ;
571 for (
int i=0 ; i<n ; i++) {
572 for (
int j=0 ; j<n ; j++)
575 sxdsdx_1d (n, &vect,
R_CHEB) ;
576 for (
int j=0 ; j<n ; j++)
577 xd.set(j, i) = vect[j]*echelle ;
580 for (
int i=0 ; i<n ; i++) {
581 for (
int j=0 ; j<n ; j++)
584 sxdsdx_1d (n, &vect,
R_CHEB) ;
585 multx_1d (n, &vect,
R_CHEB) ;
586 for (
int j=0 ; j<(n>i+1 ? i+1 : n) ; j++)
587 xd.set(j, i) += vect[j] ;
590 for (
int i=0 ; i<n ; i++) {
591 for (
int j=0 ; j<n ; j++)
594 sx2_1d (n, &vect,
R_CHEB) ;
595 for (
int j=0 ; j<n ; j++)
596 xx.set(j, i) = vect[j] ;
603 tab[nb_dejafait] =
new Matrice(res) ;
610 return *tab[indice] ;
619 static Matrice (*poisson_2d_mat[
MAX_BASE])(int, int, double, double, int);
626 poisson_2d_mat[i] = _poisson_2d_mat_pas_prevu ;
629 poisson_2d_mat[
R_CHEB >>
TRA_R] = _poisson_2d_mat_r_cheb ;
630 poisson_2d_mat[
R_CHEBP >>
TRA_R] = _poisson_2d_mat_r_chebp ;
631 poisson_2d_mat[
R_CHEBI >>
TRA_R] = _poisson_2d_mat_r_chebi ;
632 poisson_2d_mat[
R_CHEBU >>
TRA_R] = _poisson_2d_mat_r_chebu ;
double alpha
Parameter of the associated mapping.
double beta
Parameter of the associated mapping.
int dzpuis
the associated dzpuis, if in the compactified domain.
Matrice * ope_mat
Pointer on the matrix representation of the operator.
int l_quant
quantum number
int base_r
Radial basis of decomposition.
#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
virtual void do_ope_mat() const
Computes the matrix of the operator.
int nr
Number of radial points.
#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)