60 #include "type_parite.h" 85 Mtbl_cf sol_poisson_falloff(
const Map_af& mapping,
const Mtbl_cf& source,
const int k_falloff)
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 ;
106 double alpha, beta, echelle ;
107 int l_quant, m_quant;
118 Mtbl_cf solution_part(source.get_mg(), base) ;
119 Mtbl_cf solution_hom_un(source.get_mg(), base) ;
120 Mtbl_cf solution_hom_deux(source.get_mg(), base) ;
121 Mtbl_cf resultat(source.get_mg(), base) ;
123 solution_part.set_etat_qcq() ;
124 solution_hom_un.set_etat_qcq() ;
125 solution_hom_deux.set_etat_qcq() ;
126 resultat.set_etat_qcq() ;
128 for (
int l=0 ; l<nz ; l++) {
129 solution_part.t[l]->set_etat_qcq() ;
130 solution_hom_un.t[l]->set_etat_qcq() ;
131 solution_hom_deux.t[l]->set_etat_qcq() ;
132 resultat.t[l]->set_etat_qcq() ;
133 for (
int k=0 ; k<source.get_mg()->get_np(l)+2 ; k++)
134 for (
int j=0 ; j<source.get_mg()->get_nt(l) ; j++)
135 for (
int i=0 ; i<source.get_mg()->get_nr(l) ; i++)
136 resultat.set(l, k, j, i) = 0 ;
146 nr = source.get_mg()->get_nr(0) ;
147 nt = source.get_mg()->get_nt(0) ;
148 np = source.get_mg()->get_np(0) ;
153 alpha = mapping.get_alpha()[0] ;
154 beta = mapping.get_beta()[0] ;
156 for (
int k=0 ; k<np+1 ; k++)
157 for (
int j=0 ; j<nt ; j++)
158 if (nullite_plm(j, nt, k, np, base) == 1)
161 donne_lm(nz, 0, j, k, base, m_quant, l_quant, base_r) ;
164 operateur =
new Matrice(laplacien_mat(nr, l_quant, 0., 0, base_r)) ;
165 (*operateur) = combinaison(*operateur, l_quant, 0., 0, base_r) ;
168 nondege =
new Matrice(prepa_nondege(*operateur, l_quant, 0., 0, base_r)) ;
171 sol_hom =
new Tbl(solh(nr, l_quant, 0., base_r)) ;
176 for (
int i=0 ; i<nr ; i++)
177 so->set(i) = source(0, k, j, i) ;
179 sol_part =
new Tbl(solp(*operateur, *nondege, alpha, beta,
184 for (
int i=0 ; i<nr ; i++) {
185 solution_part.set(0, k, j, i) = (*sol_part)(i) ;
186 solution_hom_un.set(0, k, j, i) = (*sol_hom)(i) ;
187 solution_hom_deux.set(0, k, j, i) = 0. ;
205 for (
int zone=1 ; zone<nz ; zone++) {
206 nr = source.get_mg()->get_nr(zone) ;
207 nt = source.get_mg()->get_nt(zone) ;
208 np = source.get_mg()->get_np(zone) ;
210 if (np > np_max) np_max = np ;
211 if (nt > nt_max) nt_max = nt ;
213 alpha = mapping.get_alpha()[zone] ;
214 beta = mapping.get_beta()[zone] ;
216 for (
int k=0 ; k<np+1 ; k++)
217 for (
int j=0 ; j<nt ; j++)
218 if (nullite_plm(j, nt, k, np, base) == 1)
221 donne_lm(nz, zone, j, k, base, m_quant, l_quant, base_r) ;
224 operateur =
new Matrice(laplacien_mat
225 (nr, l_quant, beta/alpha, 0, base_r)) ;
227 (*operateur) = combinaison(*operateur, l_quant, beta/alpha, 0,
231 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
232 beta/alpha, 0, base_r)) ;
235 sol_hom =
new Tbl(solh(nr, l_quant, beta/alpha, base_r)) ;
240 for (
int i=0 ; i<nr ; i++)
241 so->set(i) = source(zone, k, j, i) ;
243 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
244 beta, *so, 0, base_r)) ;
248 for (
int i=0 ; i<nr ; i++) {
249 solution_part.set(zone, k, j, i) = (*sol_part)(i) ;
250 solution_hom_un.set(zone, k, j, i) = (*sol_hom)(0, i) ;
251 solution_hom_deux.set(zone, k, j, i) = (*sol_hom)(1, i) ;
268 int * indic =
new int [nz] ;
280 int sup_new, inf_new ;
283 for (
int k=0 ; k<np_max+1 ; k++)
284 for (
int j=0 ; j<nt_max ; j++)
285 if (nullite_plm(j, nt_max, k, np_max, base) == 1) {
292 for (
int zone=0 ; zone<nz ; zone++)
293 indic[zone] = nullite_plm(j, source.get_mg()->get_nt(zone),
294 k, source.get_mg()->get_np(zone), base);
298 for (
int zone=1 ; zone<nz ; zone++)
299 taille+=2*indic[zone] ;
306 sec_membre =
new Tbl(taille) ;
307 sec_membre->set_etat_qcq() ;
308 for (
int l=0 ; l<taille ; l++)
309 sec_membre->set(l) = 0 ;
311 systeme =
new Matrice(taille, taille) ;
312 systeme->set_etat_qcq() ;
313 for (
int l=0 ; l<taille ; l++)
314 for (
int c=0 ; c<taille ; c++)
315 systeme->set(l, c) = 0 ;
321 donne_lm (nz, 0, j, k, base, m_quant, l_quant, base_r) ;
329 nr = source.get_mg()->get_nr(0) ;
331 alpha = mapping.get_alpha()[0] ;
333 systeme->set(ligne, colonne) = 1. ;
335 for (
int i=0 ; i<nr ; i++)
336 sec_membre->set(ligne) -= solution_part(0, k, j, i) ;
344 systeme->set(ligne, colonne) = 1./alpha*l_quant ;
349 for (
int i=0 ; i<nr ; i++)
350 sec_membre->set(ligne) -=
352 *solution_part(0, k, j, i) ;
355 for (
int i=0 ; i<nr ; i++)
356 sec_membre->set(ligne) -=
357 (2*i+1)*(2*i+1)/alpha
358 *solution_part(0, k, j, i) ;
370 for (
int zone=1 ; zone<nz ; zone++)
371 if (indic[zone] == 1) {
373 nr = source.get_mg()->get_nr(zone) ;
374 alpha = mapping.get_alpha()[zone] ;
375 echelle = mapping.get_beta()[zone]/alpha ;
378 if (indic[zone-1] == 1) ligne -- ;
381 systeme->set(ligne, colonne) =
382 -
pow(echelle-1,
double(l_quant)) ;
385 systeme->set(ligne, colonne+1) =
386 -1/
pow(echelle-1,
double(l_quant+1)) ;
389 for (
int i=0 ; i<nr ; i++)
391 sec_membre->set(ligne) += solution_part(zone, k, j, i) ;
392 else sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
395 sup_new = colonne+1-ligne ;
396 if (sup_new > sup) sup = sup_new ;
403 if (indic[zone-1] == 1) {
405 systeme->set(ligne, colonne) =
406 -l_quant*
pow(echelle-1,
double(l_quant-1))/alpha ;
408 systeme->
set(ligne, colonne+1) =
409 (l_quant+1)/
pow(echelle-1,
double(l_quant+2))/alpha ;
414 for (
int i=0 ; i<nr ; i++)
416 sec_membre->
set(ligne) -=
417 i*i/alpha*solution_part(zone, k, j, i) ;
419 sec_membre->set(ligne) +=
420 i*i/alpha*solution_part(zone, k, j, i) ;
423 sup_new = colonne+1-ligne ;
424 if (sup_new > sup) sup = sup_new ;
434 systeme->set(ligne, colonne) =
435 pow(echelle+1,
double(l_quant)) ;
438 systeme->set(ligne, colonne+1) =
439 1/
pow(echelle+1,
double(l_quant+1)) ;
442 for (
int i=0 ; i<nr ; i++)
443 sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
446 inf_new = ligne-colonne ;
447 if (inf_new > inf) inf = inf_new ;
453 if (indic[zone+1] == 1) {
456 systeme->set(ligne, colonne) =
457 l_quant*
pow(echelle+1,
double(l_quant-1))/alpha ;
460 systeme->
set(ligne, colonne+1) =
461 -(l_quant+1)/
pow(echelle+1,
double(l_quant+2))/alpha ;
464 for (
int i=0 ; i<nr ; i++)
465 sec_membre->
set(ligne) -=
466 i*i/alpha*solution_part(zone, k, j, i) ;
469 inf_new = ligne-colonne ;
470 if (inf_new > inf) inf = inf_new ;
485 systeme->set(ligne, colonne) =
486 double(k_falloff+l_quant)*
pow(echelle+1,
double(l_quant)) ;
489 systeme->set(ligne, colonne+1) =
490 double(k_falloff-l_quant-1)/
pow(echelle+1,
double(l_quant+1)) ;
494 for (
int i=0 ; i<nr ; i++)
495 sec_membre->set(ligne) -=
496 (k_falloff+(echelle+1)*i*i)*solution_part(zone, k, j, i) ;
499 inf_new = ligne-colonne ;
500 if (inf_new > inf) inf = inf_new ;
510 systeme->set_band(sup, inf) ;
513 Tbl facteurs(systeme->inverse(*sec_membre)) ;
520 nr = source.get_mg()->get_nr(0) ;
521 for (
int i=0 ; i<nr ; i++)
522 resultat.set(0, k, j, i) = solution_part(0, k, j, i)
523 +facteurs(conte)*solution_hom_un(0, k, j, i) ;
528 for (
int zone=1 ; zone<nz ; zone++)
529 if (indic[zone] == 1) {
530 nr = source.get_mg()->get_nr(zone) ;
531 for (
int i=0 ; i<nr ; i++)
532 resultat.set(zone, k, j, i) =
533 solution_part(zone, k, j, i)
534 +facteurs(conte)*solution_hom_un(zone, k, j, i)
535 +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.