119 Mtbl_cf sol_dalembert(Param& par,
const Map_af& mapping,
const Mtbl_cf& source)
124 bool ced = (source.get_mg()->get_type_r(nz-1) == UNSURR ) ;
125 int nz0 = (ced ? nz - 1 : nz ) ;
126 assert ((source.get_mg()->get_type_r(0) == RARE)||(source.get_mg()->get_type_r(0) == FIN)) ;
127 for (
int l=1 ; l<nz0 ; l++) {
128 assert(source.get_mg()->get_type_r(l) == FIN) ;
129 assert(source.get_mg()->get_nt(l) == source.get_mg()->get_nt(0)) ;
130 assert(source.get_mg()->get_np(l) == source.get_mg()->get_np(0)) ;
132 assert (par.get_n_double() > 0) ;
133 assert (par.get_n_tbl_mod() > 1) ;
138 if (par.get_n_int() > 1) {
140 l_min = par.get_int(1) ;
144 const Base_val& base = source.base ;
148 int base_r, type_dal ;
150 int l_quant, m_quant;
151 nt = source.get_mg()->get_nt(0) ;
152 np = source.get_mg()->get_np(0) ;
161 Mtbl_cf solution_part(source.get_mg(), base) ;
162 Mtbl_cf solution_hom_un(source.get_mg(), base) ;
163 Mtbl_cf solution_hom_deux(source.get_mg(), base) ;
164 Mtbl_cf resultat(source.get_mg(), base) ;
166 solution_part.set_etat_qcq() ;
167 solution_hom_un.set_etat_qcq() ;
168 solution_hom_deux.set_etat_qcq() ;
169 resultat.annule_hard() ;
172 double* bc1 = &par.get_double_mod(1) ;
173 double* bc2 = &par.get_double_mod(2) ;
174 Tbl* tbc3 = &par.get_tbl_mod(1) ;
176 for (
int l=0 ; l<nz ; l++) {
177 solution_part.t[l]->annule_hard() ;
178 solution_hom_un.t[l]->annule_hard() ;
179 solution_hom_deux.t[l]->annule_hard() ;
186 nr = source.get_mg()->get_nr(lz) ;
189 alpha = mapping.get_alpha()[lz] ;
191 for (
int k=0 ; k<np+1 ; k++) {
192 for (
int j=0 ; j<nt ; j++) {
194 base.give_quant_numbers(lz, k, j, m_quant, l_quant, base_r) ;
195 assert( (source.get_mg()->get_type_r(0) == RARE) ||
198 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_quant >=l_min) )
201 par.get_tbl_mod().set(4,lz) = 2*par.get_tbl_mod()(2,lz) ;
202 par.get_tbl_mod().set(5,lz) = 2*par.get_tbl_mod()(3,lz) ;
203 par.get_tbl_mod().set(6,lz) = 2*par.get_tbl_mod()(1,lz) ;
204 par.get_tbl_mod().set(7,lz) =
205 -l_quant*(l_quant+1)*par.get_tbl_mod()(3,lz) ;
206 par.get_tbl_mod().set(8,lz) =
207 -l_quant*(l_quant+1)*par.get_tbl_mod()(2,lz) ;
208 par.get_tbl_mod().set(9,lz) =
209 -l_quant*(l_quant+1)*par.get_tbl_mod()(1,lz) ;
211 Matrice operateur(nr,nr) ;
213 get_operateur_dal(par, lz, base_r, type_dal, operateur) ;
217 for (
int i=0 ; i<nr ; i++)
218 so->set(i) = source(lz, k, j, i) ;
222 sol_part =
new Tbl(dal_inverse(base_r, type_dal, operateur,
226 sol_hom =
new Tbl(dal_inverse(base_r, type_dal, operateur,
230 for (
int i=0 ; i<nr ; i++) {
231 solution_part.set(lz, k, j, i) = (*sol_part)(i) ;
232 solution_hom_un.set(lz, k, j, i) = (*sol_hom)(i) ;
233 solution_hom_deux.set(lz, k, j, i) = 0. ;
240 double part, dpart, hom, dhom;
241 Tbl der_part(3,1,nr) ;
242 der_part.set_etat_qcq() ;
243 for (
int i=0; i<nr; i++)
244 der_part.set(0,0,i) = (*sol_part)(i) ;
245 Tbl der_hom(3,1,nr) ;
246 der_hom.set_etat_qcq() ;
247 for (
int i=0; i<nr; i++)
248 der_hom.set(0,0,i) = (*sol_hom)(i) ;
251 som_r_chebp(sol_part->t, nr, 1, 1, 1., &part) ;
252 _dsdx_r_chebp(&der_part, base_pipo) ;
253 som_r_chebi(der_part.t, nr, 1, 1, 1., &dpart) ;
254 som_r_chebp(sol_hom->t, nr, 1, 1, 1., &hom) ;
255 _dsdx_r_chebp(&der_hom, base_pipo) ;
256 som_r_chebi(der_hom.t, nr, 1, 1, 1., &dhom) ;
260 som_r_chebi(sol_part->t, nr, 1, 1, 1., &part) ;
261 _dsdx_r_chebi(&der_part, base_pipo) ;
262 som_r_chebp(der_part.t, nr, 1, 1, 1., &dpart) ;
263 som_r_chebi(sol_hom->t, nr, 1, 1, 1., &hom) ;
264 _dsdx_r_chebi(&der_hom, base_pipo) ;
265 som_r_chebp(der_hom.t, nr, 1, 1, 1., &dhom) ;
268 part = part*(*bc1) + dpart*(*bc2)/alpha ;
269 hom = hom*(*bc1) + dhom*(*bc2)/alpha ;
270 double lambda = ((*tbc3)(k,j) - part) / hom ;
271 for (
int i=0 ; i<nr ; i++)
272 resultat.set(lz, k, j, i) =
273 solution_part(lz, k, j, i)
274 +lambda*solution_hom_un(lz, k, j, i) ;
287 for (lz=1 ; lz<nz0 ; lz++) {
288 nr = source.get_mg()->get_nr(lz) ;
290 alpha = mapping.get_alpha()[lz] ;
291 beta = mapping.get_beta()[lz] ;
293 for (
int k=0 ; k<np+1 ; k++)
294 for (
int j=0 ; j<nt ; j++) {
296 base.give_quant_numbers(lz, k, j, m_quant, l_quant, base_r) ;
298 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_quant >=l_min) )
301 par.get_tbl_mod().set(4,lz) = 2*par.get_tbl_mod()(2,lz) ;
302 par.get_tbl_mod().set(5,lz) = 2*par.get_tbl_mod()(3,lz) ;
303 par.get_tbl_mod().set(6,lz) = 2*par.get_tbl_mod()(1,lz) ;
304 par.get_tbl_mod().set(7,lz) =
305 -l_quant*(l_quant+1)*par.get_tbl_mod()(3,lz) ;
306 par.get_tbl_mod().set(8,lz) =
307 -l_quant*(l_quant+1)*par.get_tbl_mod()(2,lz) ;
308 par.get_tbl_mod().set(9,lz) =
309 -l_quant*(l_quant+1)*par.get_tbl_mod()(1,lz) ;
311 Matrice operateur(nr,nr) ;
313 get_operateur_dal(par, lz, base_r, type_dal, operateur) ;
317 for (
int i=0; i<nr; i++) so->set(i) = 0. ;
319 sol_hom =
new Tbl(dal_inverse(base_r, type_dal, operateur, *so,
323 sol_hom2 =
new Tbl(dal_inverse(base_r, type_dal, operateur, *so,
327 double *tmp =
new double[nr] ;
328 for (
int i=0 ; i<nr ; i++)
329 tmp[i] = source(lz, k, j, i) ;
331 for (
int i=0; i<nr; i++) so->set(i) = beta*tmp[i] ;
332 multx_1d(nr, &tmp,
R_CHEB) ;
333 for (
int i=0; i<nr; i++) so->set(i) += alpha*tmp[i] ;
336 for (
int i=0; i<nr; i++) so->set(i) = beta*beta*tmp[i] ;
337 multx_1d(nr, &tmp,
R_CHEB) ;
338 for (
int i=0; i<nr; i++) so->set(i) += 2*alpha*beta*tmp[i] ;
339 multx_1d(nr, &tmp,
R_CHEB) ;
340 for (
int i=0; i<nr; i++) so->set(i) += alpha*alpha*tmp[i] ;
345 sol_part =
new Tbl (dal_inverse(base_r, type_dal, operateur,
348 for (
int i=0 ; i<nr ; i++) {
349 solution_part.set(lz, k, j, i) = (*sol_part)(i) ;
350 solution_hom_un.set(lz, k, j, i) = (*sol_hom)(i) ;
351 solution_hom_deux.set(lz, k, j, i) = (*sol_hom2)(i) ;
369 int taille = 2*nz0 - 1 ;
371 deuz.set_etat_qcq() ;
372 Matrice systeme(taille,taille) ;
373 systeme.set_etat_qcq() ;
375 int inf = (nz0>2) ? 2 : 1 ;
376 for (
int k=0; k<np+1; k++) {
377 for (
int j=0; j<nt; j++) {
379 base.give_quant_numbers(0, k, j, m_quant, l_quant, base_r) ;
380 if ( (nullite_plm(j, nt, k, np, base)) && (l_quant + dl >= l_min) ) {
382 int parite = (base_r ==
R_CHEBP) ? 0 : 1 ;
385 for (l=0; l<taille; l++)
386 for (c=0; c<taille; c++) systeme.set(l,c) = xx ;
387 for (l=0; l<taille; l++) deuz.set(l) = xx ;
392 nr = source.get_mg()->get_nr(0) ;
393 alpha = mapping.get_alpha()[0] ;
395 for (
int i=0; i<nr; i++)
396 systeme.set(l,c) += solution_hom_un(0, k, j, i) ;
397 for (
int i=0; i<nr; i++) deuz.set(l) -= solution_part(0, k, j, i) ;
401 for (
int i=0; i<nr; i++)
402 xx +=(2*i+parite)*(2*i+parite)
403 *solution_hom_un(0, k, j, i) ;
404 systeme.set(l,c) += xx/alpha ;
406 for (
int i=0; i<nr; i++) xx -= (2*i+parite)*
407 (2*i+parite)*solution_part(0, k, j, i) ;
408 deuz.set(l) += xx/alpha ;
413 for (lz=1; lz<nz0; lz++) {
414 nr = source.get_mg()->get_nr(lz) ;
415 alpha = mapping.get_alpha()[lz] ;
418 for (
int i=0; i<nr; i++)
420 systeme.set(l,c) -= solution_hom_un(lz, k, j, i) ;
422 systeme.set(l,c) += solution_hom_un(lz, k, j, i) ;
424 for (
int i=0; i<nr; i++)
426 systeme.set(l,c) -= solution_hom_deux(lz, k, j, i) ;
428 systeme.set(l,c) += solution_hom_deux(lz, k, j, i) ;
429 for (
int i=0; i<nr; i++)
430 if (i%2 == 0) deuz.set(l) += solution_part(lz, k, j, i) ;
431 else deuz.set(l) -= solution_part(lz, k, j, i) ;
435 for (
int i=0; i<nr; i++)
437 xx += i*i*solution_hom_un(lz, k, j, i) ;
439 xx -= i*i*solution_hom_un(lz, k, j, i) ;
440 systeme.set(l,c) += xx/alpha ;
443 for (
int i=0; i<nr; i++)
445 xx += i*i*solution_hom_deux(lz, k, j, i) ;
447 xx -= i*i*solution_hom_deux(lz, k, j, i) ;
448 systeme.set(l,c) += xx/alpha ;
450 for (
int i=0; i<nr; i++)
451 if (i%2 == 0) xx -= i*i*solution_part(lz, k, j, i) ;
452 else xx += i*i*solution_part(lz, k, j, i) ;
453 deuz.set(l) += xx/alpha ;
457 for (
int i=0; i<nr; i++)
459 ((*bc1)+(*bc2)*i*i/alpha)*solution_hom_un(lz, k, j, i) ;
461 for (
int i=0; i<nr; i++)
463 ((*bc1)+(*bc2)*i*i/alpha)*solution_hom_deux(lz, k, j, i) ;
464 for (
int i=0; i<nr; i++)
466 ((*bc1)+(*bc2)*i*i/alpha)*solution_part(lz, k, j, i) ;
467 deuz.set(l) += (*tbc3)(k,j) ;
470 for (
int i=0; i<nr; i++)
471 systeme.set(l,c) += solution_hom_un(lz, k, j, i) ;
473 for (
int i=0; i<nr; i++)
474 systeme.set(l,c) += solution_hom_deux(lz, k, j, i) ;
475 for (
int i=0; i<nr; i++)
476 deuz.set(l) -= solution_part(lz, k, j, i) ;
479 for (
int i=0; i<nr; i++) xx += i*i*solution_hom_un(lz, k, j, i) ;
480 systeme.set(l,c) += xx/alpha ;
483 for (
int i=0; i<nr; i++)
484 xx += i*i*solution_hom_deux(lz, k, j, i) ;
485 systeme.set(l,c) += xx/alpha ;
487 for (
int i=0; i<nr; i++)
488 xx -= i*i*solution_part(lz, k, j, i) ;
489 deuz.set(l) += xx/alpha ;
497 systeme.set_band(sup, inf) ;
499 Tbl facteur(systeme.inverse(deuz)) ;
502 nr = source.get_mg()->get_nr(0) ;
503 for (
int i=0; i<nr; i++)
504 resultat.set(0, k, j, i) = solution_part(0, k, j, i)
505 + facteur(0)*solution_hom_un(0, k, j, i) ;
508 for (lz=1; lz<nz0; lz++) {
509 nr = source.get_mg()->get_nr(lz) ;
510 for (
int i=0; i<nr; i++)
511 resultat.set(lz, k, j, i) = solution_part(lz, k, j, i)
512 + facteur(2*lz-1)*solution_hom_un(lz, k, j, i)
513 + facteur(2*lz)*solution_hom_deux(lz, k, j, i) ;
#define O2DEGE_LARGE
Operateur du deuxieme ordre degenere .
#define O2NOND_LARGE
Operateur du deuxieme ordre non degenere .
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
const Mg3d * get_mg() const
Returns the Mg3d on which the Mtbl_cf is defined.
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
int get_nzone() const
Returns the number of domains.
#define O2DEGE_SMALL
Operateur du deuxieme ordre degenere .
#define ORDRE1_LARGE
Operateur du premier ordre .
#define R_CHEB
base de Chebychev ordinaire (fin)