23char helmholtz_minus_mat_C[] =
"$$" ;
64#include "type_parite.h"
73Matrice _helmholtz_minus_mat_pas_prevu(
int,
int,
double,
double,
double) {
74 cout <<
"Helmholtz minus : base not implemented..." << endl ;
85Matrice _helmholtz_minus_mat_r_chebu (
int n,
int lq,
double alpha,
86 double,
double masse) {
90 Matrice res(n-2, n-2) ;
93 double* vect =
new double[n] ;
94 double* vect_bis =
new double[n] ;
95 double* vect_dd =
new double[n] ;
97 for (
int i=0 ; i<n-2 ; i++) {
99 for (
int j=0 ; j<n ; j++)
105 for (
int j=0 ; j<n ; j++)
106 vect_bis[j] = vect[j] ;
108 d2sdx2_1d (n, &vect_bis,
R_CHEBU) ;
109 mult2_xm1_1d_cheb (n, vect_bis, vect_dd) ;
112 for (
int j=0 ; j<n ; j++)
113 vect_bis[j] = vect[j] ;
114 sx2_1d (n, &vect_bis,
R_CHEBU) ;
116 for (
int j=0 ; j<n-2 ; j++)
117 res.set(j,i) = vect_dd[j] - lq*(lq+1)*vect[j]
118 - masse*masse*vect_bis[j]/alpha/alpha ;
133Matrice _helmholtz_minus_mat_r_cheb (
int n,
int lq,
double alpha,
double beta,
138 double echelle = beta / alpha ;
147 double* vect =
new double[n] ;
149 for (
int i=0 ; i<n ; i++) {
150 for (
int j=0 ; j<n ; j++)
153 d2sdx2_1d (n, &vect,
R_CHEB) ;
154 vect[i] -= masse*masse*alpha*alpha ;
155 for (
int j=0 ; j<n ; j++)
156 dd.set(j, i) = vect[j]*echelle*echelle ;
159 for (
int i=0 ; i<n ; i++) {
160 for (
int j=0 ; j<n ; j++)
163 d2sdx2_1d (n, &vect,
R_CHEB) ;
164 vect[i] -= masse*masse*alpha*alpha ;
165 multx_1d (n, &vect,
R_CHEB) ;
166 for (
int j=0 ; j<n ; j++)
167 dd.set(j, i) += 2*echelle*vect[j] ;
170 for (
int i=0 ; i<n ; i++) {
171 for (
int j=0 ; j<n ; j++)
174 d2sdx2_1d (n, &vect,
R_CHEB) ;
175 vect[i] -= masse*masse*alpha*alpha ;
176 multx_1d (n, &vect,
R_CHEB) ;
177 multx_1d (n, &vect,
R_CHEB) ;
178 for (
int j=0 ; j<n ; j++)
179 dd.set(j, i) += vect[j] ;
182 for (
int i=0 ; i<n ; i++) {
183 for (
int j=0 ; j<n ; j++)
186 sxdsdx_1d (n, &vect,
R_CHEB) ;
187 for (
int j=0 ; j<n ; j++)
188 xd.set(j, i) = vect[j]*echelle ;
191 for (
int i=0 ; i<n ; i++) {
192 for (
int j=0 ; j<n ; j++)
195 sxdsdx_1d (n, &vect,
R_CHEB) ;
196 multx_1d (n, &vect,
R_CHEB) ;
197 for (
int j=0 ; j<n ; j++)
198 xd.set(j, i) += vect[j] ;
201 for (
int i=0 ; i<n ; i++) {
202 for (
int j=0 ; j<n ; j++)
205 sx2_1d (n, &vect,
R_CHEB) ;
206 for (
int j=0 ; j<n ; j++)
207 xx.set(j, i) = vect[j] ;
213 res = dd+2*xd - lq*(lq+1)*xx;
224Matrice _helmholtz_minus_mat_r_chebp (
int n,
int lq,
double alpha,
double,
double masse) {
231 return Matrice(d2 + 2.*sxd -masse*masse*alpha*alpha*xx) ;
234 Matrice res(n-1, n-1) ;
237 double* vect =
new double[n] ;
239 double* vect_sx2 =
new double[n] ;
240 double* vect_sxd =
new double[n] ;
241 double* vect_dd =
new double[n] ;
243 for (
int i=0 ; i<n-1 ; i++) {
244 for (
int j=0 ; j<n ; j++)
250 for (
int j=0 ; j<n ; j++)
251 vect_dd[j] = vect[j] ;
252 d2sdx2_1d (n, &vect_dd,
R_CHEBP) ;
253 for (
int j=0 ; j<n ; j++)
254 vect_sxd[j] = vect[j] ;
255 sxdsdx_1d (n, &vect_sxd,
R_CHEBP) ;
256 for (
int j=0 ; j<n ; j++)
257 vect_sx2[j] = vect[j] ;
258 sx2_1d (n, &vect_sx2,
R_CHEBP) ;
260 for (
int j=0 ; j<n-1 ; j++)
261 res.set(j,i) = vect_dd[j] +2*vect_sxd[j] - lq*(lq+1)*vect_sx2[j] - masse*masse*alpha*alpha*vect[j] ;
279Matrice _helmholtz_minus_mat_r_chebi (
int n,
int lq,
double alpha,
double,
double masse) {
287 return Matrice(d2 + 2.*sxd - (lq*(lq+1))*sx2- masse*masse*alpha*alpha*xx) ;
290 Matrice res(n-1, n-1) ;
293 double* vect =
new double[n] ;
295 double* vect_sx2 =
new double[n] ;
296 double* vect_sxd =
new double[n] ;
297 double* vect_dd =
new double[n] ;
299 for (
int i=0 ; i<n-1 ; i++) {
300 for (
int j=0 ; j<n ; j++)
303 vect[i+1] = (2*i+1) ;
306 for (
int j=0 ; j<n ; j++)
307 vect_dd[j] = vect[j] ;
308 d2sdx2_1d (n, &vect_dd,
R_CHEBI) ;
309 for (
int j=0 ; j<n ; j++)
310 vect_sxd[j] = vect[j] ;
311 sxdsdx_1d (n, &vect_sxd,
R_CHEBI) ;
312 for (
int j=0 ; j<n ; j++)
313 vect_sx2[j] = vect[j] ;
314 sx2_1d (n, &vect_sx2,
R_CHEBI) ;
316 for (
int j=0 ; j<n-1 ; j++)
317 res.set(j,i) = vect_dd[j] +2*vect_sxd[j] - lq*(lq+1)*vect_sx2[j] - masse*masse*alpha*alpha*vect[j] ;
334Matrice helmholtz_minus_mat(
int n,
int lq,
335 double alpha,
double beta,
double masse,
340 static Matrice (*helmholtz_minus_mat[
MAX_BASE])(int, int,
341 double, double, double);
348 helmholtz_minus_mat[i] = _helmholtz_minus_mat_pas_prevu ;
351 helmholtz_minus_mat[
R_CHEB >>
TRA_R] = _helmholtz_minus_mat_r_cheb ;
352 helmholtz_minus_mat[
R_CHEBU >>
TRA_R] = _helmholtz_minus_mat_r_chebu ;
353 helmholtz_minus_mat[
R_CHEBP >>
TRA_R] = _helmholtz_minus_mat_r_chebp ;
354 helmholtz_minus_mat[
R_CHEBI >>
TRA_R] = _helmholtz_minus_mat_r_chebi ;
357 Matrice res(helmholtz_minus_mat[base_r](n, lq, alpha, beta, masse)) ;
#define MAX_BASE
Nombre max. de bases differentes.
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEB
base de Chebychev ordinaire (fin)
#define R_CHEBP
base de Cheb. paire (rare) seulement