60 #include "type_parite.h" 85 Mtbl_cf sol_poisson_ylm(
const Map_af& mapping,
const Mtbl_cf& source,
const int nylm,
const double* intvec)
91 assert (source.get_mg()->get_type_r(0) == RARE) ;
93 for (
int l=1 ; l<nz ; l++)
94 assert(source.get_mg()->get_type_r(l) == FIN) ;
100 const Base_val& base = source.base ;
105 double alpha, beta, echelle ;
106 int l_quant, m_quant;
117 Mtbl_cf solution_part(source.get_mg(), base) ;
118 Mtbl_cf solution_hom_un(source.get_mg(), base) ;
119 Mtbl_cf solution_hom_deux(source.get_mg(), base) ;
120 Mtbl_cf resultat(source.get_mg(), base) ;
122 solution_part.set_etat_qcq() ;
123 solution_hom_un.set_etat_qcq() ;
124 solution_hom_deux.set_etat_qcq() ;
125 resultat.set_etat_qcq() ;
127 for (
int l=0 ; l<nz ; l++) {
128 solution_part.t[l]->set_etat_qcq() ;
129 solution_hom_un.t[l]->set_etat_qcq() ;
130 solution_hom_deux.t[l]->set_etat_qcq() ;
131 resultat.t[l]->set_etat_qcq() ;
132 for (
int k=0 ; k<source.get_mg()->get_np(l)+2 ; k++)
133 for (
int j=0 ; j<source.get_mg()->get_nt(l) ; j++)
134 for (
int i=0 ; i<source.get_mg()->get_nr(l) ; i++)
135 resultat.set(l, k, j, i) = 0 ;
145 nr = source.get_mg()->get_nr(0) ;
146 nt = source.get_mg()->get_nt(0) ;
147 np = source.get_mg()->get_np(0) ;
152 alpha = mapping.get_alpha()[0] ;
153 beta = mapping.get_beta()[0] ;
155 for (
int k=0 ; k<np+1 ; k++)
156 for (
int j=0 ; j<nt ; j++)
157 if (nullite_plm(j, nt, k, np, base) == 1)
160 donne_lm(nz, 0, j, k, base, m_quant, l_quant, base_r) ;
163 operateur =
new Matrice(laplacien_mat(nr, l_quant, 0., 0, base_r)) ;
164 (*operateur) = combinaison(*operateur, l_quant, 0., 0, base_r) ;
167 nondege =
new Matrice(prepa_nondege(*operateur, l_quant, 0., 0, base_r)) ;
170 sol_hom =
new Tbl(solh(nr, l_quant, 0., base_r)) ;
175 for (
int i=0 ; i<nr ; i++)
176 so->set(i) = source(0, k, j, i) ;
178 sol_part =
new Tbl(solp(*operateur, *nondege, alpha, beta,
183 for (
int i=0 ; i<nr ; i++) {
184 solution_part.set(0, k, j, i) = (*sol_part)(i) ;
185 solution_hom_un.set(0, k, j, i) = (*sol_hom)(i) ;
186 solution_hom_deux.set(0, k, j, i) = 0. ;
204 for (
int zone=1 ; zone<nz ; zone++) {
205 nr = source.get_mg()->get_nr(zone) ;
206 nt = source.get_mg()->get_nt(zone) ;
207 np = source.get_mg()->get_np(zone) ;
209 if (np > np_max) np_max = np ;
210 if (nt > nt_max) nt_max = nt ;
212 alpha = mapping.get_alpha()[zone] ;
213 beta = mapping.get_beta()[zone] ;
215 for (
int k=0 ; k<np+1 ; k++)
216 for (
int j=0 ; j<nt ; j++)
217 if (nullite_plm(j, nt, k, np, base) == 1)
220 donne_lm(nz, zone, j, k, base, m_quant, l_quant, base_r) ;
223 operateur =
new Matrice(laplacien_mat
224 (nr, l_quant, beta/alpha, 0, base_r)) ;
226 (*operateur) = combinaison(*operateur, l_quant, beta/alpha, 0,
230 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
231 beta/alpha, 0, base_r)) ;
234 sol_hom =
new Tbl(solh(nr, l_quant, beta/alpha, base_r)) ;
239 for (
int i=0 ; i<nr ; i++)
240 so->set(i) = source(zone, k, j, i) ;
242 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
243 beta, *so, 0, base_r)) ;
247 for (
int i=0 ; i<nr ; i++) {
248 solution_part.set(zone, k, j, i) = (*sol_part)(i) ;
249 solution_hom_un.set(zone, k, j, i) = (*sol_hom)(0, i) ;
250 solution_hom_deux.set(zone, k, j, i) = (*sol_hom)(1, i) ;
267 int * indic =
new int [nz] ;
279 int sup_new, inf_new ;
282 for (
int k=0 ; k<np_max+1 ; k++)
283 for (
int j=0 ; j<nt_max ; j++)
284 if (nullite_plm(j, nt_max, k, np_max, base) == 1) {
291 for (
int zone=0 ; zone<nz ; zone++)
292 indic[zone] = nullite_plm(j, source.get_mg()->get_nt(zone),
293 k, source.get_mg()->get_np(zone), base);
297 for (
int zone=1 ; zone<nz ; zone++)
298 taille+=2*indic[zone] ;
305 sec_membre =
new Tbl(taille) ;
306 sec_membre->set_etat_qcq() ;
307 for (
int l=0 ; l<taille ; l++)
308 sec_membre->set(l) = 0 ;
310 systeme =
new Matrice(taille, taille) ;
311 systeme->set_etat_qcq() ;
312 for (
int l=0 ; l<taille ; l++)
313 for (
int c=0 ; c<taille ; c++)
314 systeme->set(l, c) = 0 ;
320 donne_lm (nz, 0, j, k, base, m_quant, l_quant, base_r) ;
328 nr = source.get_mg()->get_nr(0) ;
330 alpha = mapping.get_alpha()[0] ;
332 systeme->set(ligne, colonne) = 1. ;
334 for (
int i=0 ; i<nr ; i++)
335 sec_membre->set(ligne) -= solution_part(0, k, j, i) ;
343 systeme->set(ligne, colonne) = 1./alpha*l_quant ;
348 for (
int i=0 ; i<nr ; i++)
349 sec_membre->set(ligne) -=
351 *solution_part(0, k, j, i) ;
354 for (
int i=0 ; i<nr ; i++)
355 sec_membre->set(ligne) -=
356 (2*i+1)*(2*i+1)/alpha
357 *solution_part(0, k, j, i) ;
369 for (
int zone=1 ; zone<nz ; zone++)
370 if (indic[zone] == 1) {
372 nr = source.get_mg()->get_nr(zone) ;
373 alpha = mapping.get_alpha()[zone] ;
374 echelle = mapping.get_beta()[zone]/alpha ;
377 if (indic[zone-1] == 1) ligne -- ;
380 systeme->set(ligne, colonne) =
381 -
pow(echelle-1,
double(l_quant)) ;
384 systeme->set(ligne, colonne+1) =
385 -1/
pow(echelle-1,
double(l_quant+1)) ;
388 for (
int i=0 ; i<nr ; i++)
390 sec_membre->set(ligne) += solution_part(zone, k, j, i) ;
391 else sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
394 sup_new = colonne+1-ligne ;
395 if (sup_new > sup) sup = sup_new ;
402 if (indic[zone-1] == 1) {
404 systeme->set(ligne, colonne) =
405 -l_quant*
pow(echelle-1,
double(l_quant-1))/alpha ;
407 systeme->
set(ligne, colonne+1) =
408 (l_quant+1)/
pow(echelle-1,
double(l_quant+2))/alpha ;
413 for (
int i=0 ; i<nr ; i++)
415 sec_membre->
set(ligne) -=
416 i*i/alpha*solution_part(zone, k, j, i) ;
418 sec_membre->set(ligne) +=
419 i*i/alpha*solution_part(zone, k, j, i) ;
422 sup_new = colonne+1-ligne ;
423 if (sup_new > sup) sup = sup_new ;
433 systeme->set(ligne, colonne) =
434 pow(echelle+1,
double(l_quant)) ;
437 systeme->set(ligne, colonne+1) =
438 1/
pow(echelle+1,
double(l_quant+1)) ;
441 for (
int i=0 ; i<nr ; i++)
442 sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
445 inf_new = ligne-colonne ;
446 if (inf_new > inf) inf = inf_new ;
452 if (indic[zone+1] == 1) {
455 systeme->set(ligne, colonne) =
456 l_quant*
pow(echelle+1,
double(l_quant-1))/alpha ;
459 systeme->
set(ligne, colonne+1) =
460 -(l_quant+1)/
pow(echelle+1,
double(l_quant+2))/alpha ;
463 for (
int i=0 ; i<nr ; i++)
464 sec_membre->
set(ligne) -=
465 i*i/alpha*solution_part(zone, k, j, i) ;
468 inf_new = ligne-colonne ;
469 if (inf_new > inf) inf = inf_new ;
484 systeme->set(ligne, colonne) =
485 pow(echelle+1,
double(l_quant)) ;
488 systeme->set(ligne, colonne+1) =
489 pow(echelle+1,
double(-1-l_quant)) ;
496 if(l_quant*l_quant < nylm && m_quant<=l_quant) {
497 indylm=l_quant*l_quant+2*m_quant;
498 if(k%2==0 && k>=2)indylm-=1;
499 intterm=intvec[indylm];
500 cout <<
"l,m:"<<l_quant<<
" "<<m_quant<<
" "<<j<<
" "<<k<<
" "<<indylm<<
" "<<intterm<<endl;
509 sec_membre->set(ligne) -= intterm;
512 for (
int i=0 ; i<nr ; i++)
513 sec_membre->set(ligne) -=
514 solution_part(zone, k, j, i) ;
517 inf_new = ligne-colonne ;
518 if (inf_new > inf) inf = inf_new ;
528 systeme->set_band(sup, inf) ;
531 Tbl facteurs(systeme->inverse(*sec_membre)) ;
538 nr = source.get_mg()->get_nr(0) ;
539 for (
int i=0 ; i<nr ; i++)
540 resultat.set(0, k, j, i) = solution_part(0, k, j, i)
541 +facteurs(conte)*solution_hom_un(0, k, j, i) ;
546 for (
int zone=1 ; zone<nz ; zone++)
547 if (indic[zone] == 1) {
548 nr = source.get_mg()->get_nr(zone) ;
549 for (
int i=0 ; i<nr ; i++)
550 resultat.set(zone, k, j, i) =
551 solution_part(zone, k, j, i)
552 +facteurs(conte)*solution_hom_un(zone, k, j, i)
553 +facteurs(conte+1)*solution_hom_deux(zone, k, j, i) ;
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.