157 #include "type_parite.h" 182 Mtbl_cf sol_poisson(
const Map_af& mapping,
const Mtbl_cf& source,
int dzpuis,
189 assert ((source.get_mg()->get_type_r(0) == RARE) || (source.get_mg()->get_type_r(0) == FIN)) ;
190 assert (source.get_mg()->get_type_r(nz-1) == UNSURR) ;
191 for (
int l=1 ; l<nz-1 ; l++)
192 assert(source.get_mg()->get_type_r(l) == FIN) ;
194 assert ((dzpuis==4) || (dzpuis==2) || (dzpuis==3) || (dzpuis==5)) ;
195 assert ((!match) || (dzpuis != 5)) ;
198 const Base_val& base = source.base ;
204 double alpha, beta, echelle ;
205 int l_quant, m_quant;
210 Tbl *sol_part = 0x0 ;
211 Matrice *operateur = 0x0 ;
212 Matrice *nondege = 0x0 ;
216 Mtbl_cf solution_part(source.get_mg(), base) ;
217 Mtbl_cf solution_hom_un(source.get_mg(), base) ;
218 Mtbl_cf solution_hom_deux(source.get_mg(), base) ;
219 Mtbl_cf resultat(source.get_mg(), base) ;
221 solution_part.set_etat_qcq() ;
222 solution_hom_un.set_etat_qcq() ;
223 solution_hom_deux.set_etat_qcq() ;
224 resultat.annule_hard() ;
225 for (
int l=0 ; l<nz ; l++) {
226 solution_part.t[l]->set_etat_qcq() ;
227 solution_hom_un.t[l]->set_etat_qcq() ;
228 solution_hom_deux.t[l]->set_etat_qcq() ;
237 nr = source.get_mg()->get_nr(0) ;
238 nt = source.get_mg()->get_nt(0) ;
239 np = source.get_mg()->get_np(0) ;
244 alpha = mapping.get_alpha()[0] ;
245 beta = mapping.get_beta()[0] ;
247 for (
int k=0 ; k<np+1 ; k++)
248 for (
int j=0 ; j<nt ; j++)
249 if (nullite_plm(j, nt, k, np, base) == 1)
252 donne_lm(nz, 0, j, k, base, m_quant, l_quant, base_r) ;
253 assert( (source.get_mg()->get_type_r(0) == RARE) ||
257 operateur =
new Matrice(laplacien_mat(nr, l_quant, 0., 0, base_r)) ;
258 (*operateur) = combinaison(*operateur, l_quant, 0., 0, base_r) ;
261 nondege =
new Matrice(prepa_nondege(*operateur, l_quant, 0., 0, base_r)) ;
265 sol_hom =
new Tbl(solh(nr, l_quant, 0., base_r)) ;
271 for (
int i=0 ; i<nr ; i++)
272 so->set(i) = source(0, k, j, i) ;
274 sol_part =
new Tbl(solp(*operateur, *nondege, alpha, beta,
279 for (
int i=0 ; i<nr ; i++) {
280 solution_part.set(0, k, j, i) = (*sol_part)(i) ;
283 solution_hom_un.set(0, k, j, i) = (*sol_hom)(0, i) ;
284 solution_hom_deux.set(0, k, j, i) = (*sol_hom)(1, i) ;
287 solution_hom_un.set(0, k, j, i) = (*sol_hom)(i) ;
288 solution_hom_deux.set(0, k, j, i) = 0. ;
298 if (match)
delete sol_hom ;
307 nr = source.get_mg()->get_nr(nz-1) ;
308 nt = source.get_mg()->get_nt(nz-1) ;
309 np = source.get_mg()->get_np(nz-1) ;
311 if (np > np_max) np_max = np ;
312 if (nt > nt_max) nt_max = nt ;
314 alpha = mapping.get_alpha()[nz-1] ;
315 beta = mapping.get_beta()[nz-1] ;
317 for (
int k=0 ; k<np+1 ; k++)
318 for (
int j=0 ; j<nt ; j++)
319 if (nullite_plm(j, nt, k, np, base) == 1)
323 donne_lm(nz, nz-1, j, k, base, m_quant, l_quant, base_r) ;
326 operateur =
new Matrice(laplacien_mat(nr, l_quant, 0., dzpuis,
328 (*operateur) = combinaison(*operateur, l_quant, 0., dzpuis, base_r) ;
330 nondege =
new Matrice(prepa_nondege(*operateur, l_quant, 0.,
334 sol_hom =
new Tbl(solh(nr, l_quant, 0., base_r)) ;
339 for (
int i=0 ; i<nr ; i++)
340 so->set(i) = source(nz-1, k, j, i) ;
341 sol_part =
new Tbl(solp(*operateur, *nondege, alpha, beta,
342 *so, dzpuis, base_r)) ;
345 for (
int i=0 ; i<nr ; i++) {
346 solution_part.set(nz-1, k, j, i) = (*sol_part)(i) ;
348 solution_hom_un.set(nz-1, k, j, i) = (*sol_hom)(i) ;
349 solution_hom_deux.set(nz-1, k, j, i) = 0. ;
356 if (match)
delete sol_hom ;
364 for (
int zone=1 ; zone<nz-1 ; zone++) {
365 nr = source.get_mg()->get_nr(zone) ;
366 nt = source.get_mg()->get_nt(zone) ;
367 np = source.get_mg()->get_np(zone) ;
369 if (np > np_max) np_max = np ;
370 if (nt > nt_max) nt_max = nt ;
372 alpha = mapping.get_alpha()[zone] ;
373 beta = mapping.get_beta()[zone] ;
375 for (
int k=0 ; k<np+1 ; k++)
376 for (
int j=0 ; j<nt ; j++)
377 if (nullite_plm(j, nt, k, np, base) == 1)
380 donne_lm(nz, zone, j, k, base, m_quant, l_quant, base_r) ;
383 operateur =
new Matrice(laplacien_mat
384 (nr, l_quant, beta/alpha, 0, base_r)) ;
386 (*operateur) = combinaison(*operateur, l_quant, beta/alpha, 0,
390 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
391 beta/alpha, 0, base_r)) ;
394 sol_hom =
new Tbl(solh(nr, l_quant, beta/alpha, base_r)) ;
400 for (
int i=0 ; i<nr ; i++)
401 so->set(i) = source(zone, k, j, i) ;
403 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
404 beta, *so, 0, base_r)) ;
408 for (
int i=0 ; i<nr ; i++) {
409 solution_part.set(zone, k, j, i) = (*sol_part)(i) ;
411 solution_hom_un.set(zone, k, j, i) = (*sol_hom)(0, i) ;
412 solution_hom_deux.set(zone, k, j, i) = (*sol_hom)(1, i) ;
420 if (match)
delete sol_hom ;
433 int * indic =
new int [nz] ;
445 int sup_new, inf_new ;
448 for (
int k=0 ; k<np_max+1 ; k++)
449 for (
int j=0 ; j<nt_max ; j++)
450 if (nullite_plm(j, nt_max, k, np_max, base) == 1) {
457 for (
int zone=0 ; zone<nz ; zone++)
458 indic[zone] = nullite_plm(j, source.get_mg()->get_nt(zone),
459 k, source.get_mg()->get_np(zone), base);
462 taille = indic[nz-1]+indic[0] ;
463 for (
int zone=1 ; zone<nz-1 ; zone++)
464 taille+=2*indic[zone] ;
471 sec_membre =
new Tbl(taille) ;
472 sec_membre->set_etat_qcq() ;
473 for (
int l=0 ; l<taille ; l++)
474 sec_membre->set(l) = 0 ;
476 systeme =
new Matrice(taille, taille) ;
477 systeme->set_etat_qcq() ;
478 for (
int l=0 ; l<taille ; l++)
479 for (
int c=0 ; c<taille ; c++)
480 systeme->set(l, c) = 0 ;
486 donne_lm (nz, 0, j, k, base, m_quant, l_quant, base_r) ;
494 nr = source.get_mg()->get_nr(0) ;
496 alpha = mapping.get_alpha()[0] ;
498 systeme->set(ligne, colonne) = 1. ;
500 for (
int i=0 ; i<nr ; i++)
501 sec_membre->set(ligne) -= solution_part(0, k, j, i) ;
513 systeme->set(ligne, colonne) = 1./alpha*l_quant ;
518 for (
int i=0 ; i<nr ; i++)
519 sec_membre->set(ligne) -=
521 *solution_part(0, k, j, i) ;
524 for (
int i=0 ; i<nr ; i++)
525 sec_membre->set(ligne) -=
526 (2*i+1)*(2*i+1)/alpha
527 *solution_part(0, k, j, i) ;
539 for (
int zone=1 ; zone<nz-1 ; zone++)
540 if (indic[zone] == 1) {
542 nr = source.get_mg()->get_nr(zone) ;
543 alpha = mapping.get_alpha()[zone] ;
544 echelle = mapping.get_beta()[zone]/alpha ;
547 if (indic[zone-1] == 1) ligne -- ;
550 systeme->set(ligne, colonne) =
551 -
pow(echelle-1,
double(l_quant)) ;
554 systeme->set(ligne, colonne+1) =
555 -1/
pow(echelle-1,
double(l_quant+1)) ;
558 for (
int i=0 ; i<nr ; i++)
560 sec_membre->set(ligne) += solution_part(zone, k, j, i) ;
561 else sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
564 sup_new = colonne+1-ligne ;
565 if (sup_new > sup) sup = sup_new ;
572 if (indic[zone-1] == 1) {
574 systeme->set(ligne, colonne) =
575 -l_quant*
pow(echelle-1,
double(l_quant-1))/alpha ;
577 systeme->
set(ligne, colonne+1) =
578 (l_quant+1)/
pow(echelle-1,
double(l_quant+2))/alpha ;
583 for (
int i=0 ; i<nr ; i++)
585 sec_membre->
set(ligne) -=
586 i*i/alpha*solution_part(zone, k, j, i) ;
588 sec_membre->set(ligne) +=
589 i*i/alpha*solution_part(zone, k, j, i) ;
592 sup_new = colonne+1-ligne ;
593 if (sup_new > sup) sup = sup_new ;
600 systeme->set(ligne, colonne) =
601 pow(echelle+1,
double(l_quant)) ;
604 systeme->set(ligne, colonne+1) =
605 1/
pow(echelle+1,
double(l_quant+1)) ;
608 for (
int i=0 ; i<nr ; i++)
609 sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
612 inf_new = ligne-colonne ;
613 if (inf_new > inf) inf = inf_new ;
619 if (indic[zone+1] == 1) {
622 systeme->set(ligne, colonne) =
623 l_quant*
pow(echelle+1,
double(l_quant-1))/alpha ;
626 systeme->
set(ligne, colonne+1) =
627 -(l_quant+1)/
pow(echelle+1,
double(l_quant+2))/alpha ;
630 for (
int i=0 ; i<nr ; i++)
631 sec_membre->
set(ligne) -=
632 i*i/alpha*solution_part(zone, k, j, i) ;
635 inf_new = ligne-colonne ;
636 if (inf_new > inf) inf = inf_new ;
647 if (indic[nz-1] == 1) {
649 nr = source.get_mg()->get_nr(nz-1) ;
652 alpha = mapping.get_alpha()[nz-1] ;
654 if (indic[nz-2] == 1) ligne -- ;
657 systeme->set(ligne, colonne) = -
pow(-2,
double(l_quant+1)) ;
659 for (
int i=0 ; i<nr ; i++)
661 sec_membre->set(ligne) += solution_part(nz-1, k, j, i) ;
662 else sec_membre->set(ligne) -= solution_part(nz-1, k, j, i) ;
665 if (indic[nz-2] == 1) {
668 systeme->set(ligne+1, colonne) =
669 alpha*(l_quant+1)*
pow(-2.,
double(l_quant+2)) ;
672 for (
int i=0 ; i<nr ; i++)
674 sec_membre->
set(ligne+1) -=
675 -4*alpha*i*i*solution_part(nz-1, k, j, i) ;
677 sec_membre->set(ligne+1) +=
678 -4*alpha*i*i*solution_part(nz-1, k, j, i) ;
681 if (sup == 0) sup = 1 ;
689 systeme->set_band(sup, inf) ;
692 Tbl facteurs(systeme->inverse(*sec_membre)) ;
699 nr = source.get_mg()->get_nr(0) ;
700 for (
int i=0 ; i<nr ; i++)
701 resultat.set(0, k, j, i) = solution_part(0, k, j, i)
702 +facteurs(conte)*solution_hom_un(0, k, j, i) ;
707 for (
int zone=1 ; zone<nz-1 ; zone++)
708 if (indic[zone] == 1) {
709 nr = source.get_mg()->get_nr(zone) ;
710 for (
int i=0 ; i<nr ; i++)
711 resultat.set(zone, k, j, i) =
712 solution_part(zone, k, j, i)
713 +facteurs(conte)*solution_hom_un(zone, k, j, i)
714 +facteurs(conte+1)*solution_hom_deux(zone, k, j, i) ;
719 if (indic[nz-1] == 1) {
720 nr = source.get_mg()->get_nr(nz-1) ;
721 for (
int i=0 ; i<nr ; i++)
722 resultat.set(nz-1, k, j, i) =
723 solution_part(nz-1, k, j, i)
724 +facteurs(conte)*solution_hom_un(nz-1, k, j, i) ;
737 for (
int zone = 0; zone < nz; zone++)
738 for (
int k=0 ; k<source.get_mg()->get_np(zone)+1 ; k++)
739 for (
int j=0 ; j<source.get_mg()->get_nt(zone) ; j++)
740 if (nullite_plm(j,source.get_mg()->get_nt(zone) ,
741 k, source.get_mg()->get_np(zone), base) == 1)
742 for (
int i=0; i<source.get_mg()->get_nr(zone); i++)
743 resultat.set(zone, k, j, i) = solution_part(zone, k, j, i) ;
#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_CHEBP
base de Cheb. paire (rare) seulement
int get_nzone() const
Returns the number of domains.
Cmp pow(const Cmp &, int)
Power .
Tbl & set(int l)
Read/write of the value in a given domain.