63 #include "type_parite.h" 80 Matrice _lap_cpt_mat_pas_prevu(
int n,
int l) {
81 cout <<
"laplacien * (1-r^2/R_0^2) pas prevu..." << endl ;
82 cout <<
"n : " << n << endl ;
83 cout <<
"l : " << l << endl ;
96 Matrice _lap_cpt_mat_r_chebp (
int n,
int l) {
98 const int nmax = 200 ;
99 static Matrice* tab[nmax] ;
100 static int nb_dejafait = 0 ;
101 static int l_dejafait[nmax] ;
102 static int nr_dejafait[nmax] ;
107 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
108 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
113 if (nb_dejafait >= nmax) {
114 cout <<
"_laplacien_nul_mat_r_chebp : trop de matrices" << endl ;
120 l_dejafait[nb_dejafait] = l ;
121 nr_dejafait[nb_dejafait] = n ;
123 Matrice res(n-1, n-1) ;
127 double* xdsdx =
new double[n] ;
128 double* x2d2sdx2 =
new double[n] ;
129 double* d2sdx2 =
new double[n] ;
130 double* sxdsdx =
new double[n] ;
131 double* sx2 =
new double [n] ;
133 for (
int i=0 ; i< n-1 ; i++) {
134 for (
int j=0 ; j<n ; j++)
138 xdsdx_1d (n, &xdsdx,
R_CHEBP) ;
141 for (
int j=0 ; j<n ; j++)
146 d2sdx2_1d(n, &x2d2sdx2,
R_CHEBP) ;
147 for (
int j=0 ; j<n ; j++)
148 d2sdx2[j] = x2d2sdx2[j] ;
149 multx2_1d(n, &x2d2sdx2,
R_CHEBP) ;
152 for (
int j=0 ; j<n ; j++)
156 sxdsdx_1d(n, &sxdsdx,
R_CHEBP) ;
159 for (
int j=0 ; j<n ; j++)
165 for (
int j=0 ; j<n-1 ; j++)
166 res.set(j, i) = (d2sdx2[j] + 2*sxdsdx[j] - l*(l+1)*sx2[j])
167 - (x2d2sdx2[j]+2*xdsdx[j]) ;
168 res.set(i, i) += l*(l+1) ;
170 res.set(i+1, i) += l*(l+1) ;
178 tab[nb_dejafait] =
new Matrice(res) ;
183 return *tab[indice] ;
193 Matrice _lap_cpt_mat_r_chebi (
int n,
int l) {
195 const int nmax = 200 ;
196 static Matrice* tab[nmax] ;
197 static int nb_dejafait = 0 ;
198 static int l_dejafait[nmax] ;
199 static int nr_dejafait[nmax] ;
204 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
205 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
210 if (nb_dejafait >= nmax) {
211 cout <<
"_laplacien_nul_mat_r_chebp : trop de matrices" << endl ;
217 l_dejafait[nb_dejafait] = l ;
218 nr_dejafait[nb_dejafait] = n ;
221 int taille = (l == 1) ? n : n-1 ;
222 Matrice res(taille, taille) ;
226 double* xdsdx =
new double[n] ;
227 double* x2d2sdx2 =
new double[n] ;
228 double* d2sdx2 =
new double[n] ;
229 double* sxdsdx =
new double[n] ;
230 double* sx2 =
new double [n] ;
234 for (
int i=0 ; i<taille ; i++) {
246 for (
int j=0 ; j<n ; j++)
250 xdsdx[i+1] = f_deux ;
251 xdsdx_1d (n, &xdsdx,
R_CHEBI) ;
254 for (
int j=0 ; j<n ; j++)
258 x2d2sdx2[i+1] = f_deux ;
260 d2sdx2_1d(n, &x2d2sdx2,
R_CHEBI) ;
261 for (
int j=0 ; j<n ; j++)
262 d2sdx2[j] = x2d2sdx2[j] ;
263 multx2_1d(n, &x2d2sdx2,
R_CHEBI) ;
266 for (
int j=0 ; j<n ; j++)
270 sxdsdx[i+1] = f_deux ;
271 sxdsdx_1d(n, &sxdsdx,
R_CHEBI) ;
274 for (
int j=0 ; j<n ; j++)
281 for (
int j=0 ; j<taille ; j++)
282 res.set(j, i) = (d2sdx2[j] + 2*sxdsdx[j] - l*(l+1)*sx2[j])
283 - (x2d2sdx2[j]+2*xdsdx[j]) ;
284 res.set(i, i) += l*(l+1)*f_un ;
286 res.set(i+1, i) += l*(l+1)*f_deux ;
294 tab[nb_dejafait] =
new Matrice(res) ;
299 return *tab[indice] ;
306 Matrice lap_cpt_mat(
int n,
int l,
int base_r)
310 static Matrice (*lap_cpt_mat[
MAX_BASE])(int, int) ;
317 lap_cpt_mat[i] = _lap_cpt_mat_pas_prevu ;
324 Matrice res(lap_cpt_mat[base_r](n, l)) ;
#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 MAX_BASE
Nombre max. de bases differentes.