125 #include "type_parite.h" 151 Matrice _prepa_nondege_pas_prevu(
const Matrice &lap,
int l,
double echelle,
int puis) {
152 cout <<
"Construction non degeneree pas prevue..." << endl ;
153 cout <<
"l : " << l << endl ;
154 cout <<
"lap : " << lap << endl ;
155 cout <<
"echelle : " << echelle << endl ;
156 cout <<
" puis : " << puis << endl ;
169 Matrice _prepa_nondege_r_cheb (
const Matrice &lap,
int l,
double echelle,
int) {
174 const int nmax = 200 ;
175 static Matrice* tab[nmax] ;
176 static int nb_dejafait = 0 ;
177 static int l_dejafait[nmax] ;
178 static int nr_dejafait[nmax] ;
179 static double vieux_echelle = 0;
182 if (vieux_echelle != echelle) {
183 for (
int i=0 ; i<nb_dejafait ; i++) {
185 nr_dejafait[i] = -1 ;
188 vieux_echelle = echelle ;
195 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
196 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
201 if (nb_dejafait >= nmax) {
202 cout <<
"_prepa_nondege_r_cheb : trop de matrices" << endl ;
208 l_dejafait[nb_dejafait] = l ;
209 nr_dejafait[nb_dejafait] = n ;
214 Matrice res(n-2, n-2) ;
216 for (
int i=0 ; i<n-2 ; i++)
217 for (
int j=0 ; j<n-2 ; j++)
218 res.set(i, j) = lap(i, j+2) ;
222 tab[nb_dejafait] =
new Matrice(res) ;
229 return *tab[indice] ;
237 Matrice _prepa_nondege_r_jaco02 (
const Matrice &lap,
int l,
double echelle,
int) {
242 const int nmax = 200 ;
243 static Matrice* tab[nmax] ;
244 static int nb_dejafait = 0 ;
245 static int l_dejafait[nmax] ;
246 static int nr_dejafait[nmax] ;
247 static double vieux_echelle = 0;
250 if (vieux_echelle != echelle) {
251 for (
int i=0 ; i<nb_dejafait ; i++) {
253 nr_dejafait[i] = -1 ;
256 vieux_echelle = echelle ;
263 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
264 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
269 if (nb_dejafait >= nmax) {
270 cout <<
"_prepa_nondege_r_jaco02 : trop de matrices" << endl ;
276 l_dejafait[nb_dejafait] = l ;
277 nr_dejafait[nb_dejafait] = n ;
282 Matrice res(n-2, n-2) ;
284 for (
int i=0 ; i<n-2 ; i++)
285 for (
int j=0 ; j<n-2 ; j++)
286 res.set(i, j) = lap(i, j+2) ;
290 tab[nb_dejafait] =
new Matrice(res) ;
297 return *tab[indice] ;
304 Matrice _prepa_nondege_r_chebp (
const Matrice &lap,
int l,
double,
int) {
309 const int nmax = 200 ;
310 static Matrice* tab[nmax] ;
311 static int nb_dejafait = 0 ;
312 static int l_dejafait[nmax] ;
313 static int nr_dejafait[nmax] ;
318 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
319 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
324 if (nb_dejafait >= nmax) {
325 cout <<
"_prepa_nondege_r_chebp : trop de matrices" << endl ;
331 l_dejafait[nb_dejafait] = l ;
332 nr_dejafait[nb_dejafait] = n ;
334 assert (div(l, 2).rem == 0) ;
338 Matrice res(n-1, n-1) ;
340 for (
int i=0 ; i<n-1 ; i++)
341 for (
int j=0 ; j<n-1 ; j++)
342 res.set(i, j) = lap(i, j+1) ;
345 tab[nb_dejafait] =
new Matrice(res) ;
350 Matrice res(n-2, n-2) ;
352 for (
int i=0 ;i<n-2 ; i++)
353 for (
int j=0 ; j<n-2 ; j++)
354 res.set(i, j) = lap(i, j+2) ;
358 tab[nb_dejafait] =
new Matrice(res) ;
365 return *tab[indice] ;
375 Matrice _prepa_nondege_r_chebi (
const Matrice &lap,
int l,
double,
int) {
379 const int nmax = 200 ;
380 static Matrice* tab[nmax] ;
381 static int nb_dejafait = 0 ;
382 static int l_dejafait[nmax] ;
383 static int nr_dejafait[nmax] ;
388 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
389 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
394 if (nb_dejafait >= nmax) {
395 cout <<
"_prepa_nondege_r_chebi : trop de matrices" << endl ;
401 l_dejafait[nb_dejafait] = l ;
402 nr_dejafait[nb_dejafait] = n ;
405 assert (div(l, 2).rem == 1) ;
409 Matrice res(n-1, n-1) ;
411 for (
int i=0 ; i<n-1 ; i++)
412 for (
int j=0 ; j<n-1 ; j++)
413 res.set(i, j) = lap(i, j+1) ;
416 tab[nb_dejafait] =
new Matrice(res) ;
421 Matrice res(n-2, n-2) ;
423 for (
int i=0 ;i<n-2 ; i++)
424 for (
int j=0 ; j<n-2 ; j++)
425 res.set(i, j) = lap(i, j+2) ;
429 tab[nb_dejafait] =
new Matrice(res) ;
436 return *tab[indice] ;
447 Matrice _prepa_nondege_r_chebu (
const Matrice &lap,
int l,
double,
int puis) {
451 return _prepa_nondege_r_chebu_cinq (lap, l) ;
453 return _prepa_nondege_r_chebu_quatre (lap, l) ;
455 return _prepa_nondege_r_chebu_trois (lap, l) ;
457 return _prepa_nondege_r_chebu_deux (lap, l) ;
461 return Matrice(0, 0) ;
466 Matrice _prepa_nondege_r_chebu_quatre (
const Matrice &lap,
int l) {
470 const int nmax = 200;
471 static Matrice* tab[nmax] ;
472 static int nb_dejafait = 0 ;
473 static int l_dejafait[nmax] ;
474 static int nr_dejafait[nmax] ;
479 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
480 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
485 if (nb_dejafait >= nmax) {
486 cout <<
"_prepa_nondege_r_chebu : trop de matrices" << endl ;
492 l_dejafait[nb_dejafait] = l ;
493 nr_dejafait[nb_dejafait] = n ;
498 Matrice res(n-2, n-2) ;
500 for (
int i=0 ; i<n-2 ; i++)
501 for (
int j=0 ; j<n-2 ; j++)
502 res.set(i, j) = lap(i, j+2) ;
505 tab[nb_dejafait] =
new Matrice(res) ;
510 Matrice res(n-3, n-3) ;
512 for (
int i=0 ;i<n-3 ; i++)
513 for (
int j=0 ; j<n-3 ; j++)
514 res.set(i, j) = lap(i, j+3) ;
518 tab[nb_dejafait] =
new Matrice(res) ;
525 return *tab[indice] ;
528 Matrice _prepa_nondege_r_chebu_trois (
const Matrice &lap,
int l) {
532 const int nmax = 200;
533 static Matrice* tab[nmax] ;
534 static int nb_dejafait = 0 ;
535 static int l_dejafait[nmax] ;
536 static int nr_dejafait[nmax] ;
541 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
542 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
547 if (nb_dejafait >= nmax) {
548 cout <<
"_prepa_nondege_r_chebu_trois : trop de matrices" << endl ;
553 l_dejafait[nb_dejafait] = l ;
554 nr_dejafait[nb_dejafait] = n ;
556 Matrice res(n-2, n-2) ;
558 for (
int i=0 ; i<n-2 ; i++)
559 for (
int j=0 ; j<n-2 ; j++)
560 res.set(i, j) = lap(i, j+2) ;
563 tab[nb_dejafait] =
new Matrice(res) ;
569 return *tab[indice] ;
573 Matrice _prepa_nondege_r_chebu_deux (
const Matrice &lap,
int l) {
577 const int nmax = 200;
578 static Matrice* tab[nmax] ;
579 static int nb_dejafait = 0 ;
580 static int l_dejafait[nmax] ;
581 static int nr_dejafait[nmax] ;
586 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
587 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
592 if (nb_dejafait >= nmax) {
593 cout <<
"_prepa_nondege_r_chebu : trop de matrices" << endl ;
599 l_dejafait[nb_dejafait] = l ;
600 nr_dejafait[nb_dejafait] = n ;
605 Matrice res(n-2, n-2) ;
607 for (
int i=0 ;i<n-2 ; i++)
608 for (
int j=0 ; j<n-2 ; j++)
609 res.set(i, j) = lap(i, j+2) ;
612 tab[nb_dejafait] =
new Matrice(res) ;
617 Matrice res(n-1, n-1) ;
619 for (
int i=0 ;i<n-1 ; i++)
620 for (
int j=0 ; j<n-1 ; j++)
621 res.set(i, j) = lap(i, j+1) ;
624 tab[nb_dejafait] =
new Matrice(res) ;
631 return *tab[indice] ;
635 Matrice _prepa_nondege_r_chebu_cinq (
const Matrice &lap,
int l) {
639 const int nmax = 200;
640 static Matrice* tab[nmax] ;
641 static int nb_dejafait = 0 ;
642 static int l_dejafait[nmax] ;
643 static int nr_dejafait[nmax] ;
648 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
649 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
654 if (nb_dejafait >= nmax) {
655 cout <<
"_prepa_nondege_r_chebu : trop de matrices" << endl ;
661 l_dejafait[nb_dejafait] = l ;
662 nr_dejafait[nb_dejafait] = n ;
667 tab[nb_dejafait] =
new Matrice(lap) ;
668 tab[nb_dejafait]->set_band(5,0) ;
669 tab[nb_dejafait]->set_lu() ;
671 return *tab[nb_dejafait-1] ;
674 Matrice res(n-1, n-1) ;
676 for (
int i=0 ;i<n-1 ; i++)
677 for (
int j=0 ; j<n-1 ; j++)
678 res.set(i, j) = lap(i, j+1) ;
681 tab[nb_dejafait] =
new Matrice(res) ;
689 return *tab[indice] ;
697 Matrice prepa_nondege(
const Matrice &lap,
int l,
double echelle,
int puis,
int base_r)
701 static Matrice (*prepa_nondege[
MAX_BASE])(
const Matrice&, int, double, int) ;
708 prepa_nondege[i] = _prepa_nondege_pas_prevu ;
711 prepa_nondege[
R_CHEB >>
TRA_R] = _prepa_nondege_r_cheb ;
712 prepa_nondege[
R_CHEBU >>
TRA_R] = _prepa_nondege_r_chebu ;
713 prepa_nondege[
R_CHEBP >>
TRA_R] = _prepa_nondege_r_chebp ;
714 prepa_nondege[
R_CHEBI >>
TRA_R] = _prepa_nondege_r_chebi ;
718 Matrice res(prepa_nondege[base_r](lap, l, echelle, puis)) ;
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
#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
int get_dim(int i) const
Returns the dimension of the matrix.
#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)