79 #include "type_parite.h" 80 #include "utilitaires.h" 111 Mtbl_cf sol_poisson_frontiere(
const Map_af& mapping,
const Mtbl_cf& source,
112 const Mtbl_cf& limite,
int type_raccord,
int num_front,
int dzpuis,
double fact_dir,
double fact_neu)
119 assert ((num_front>=0) && (num_front<nz-2)) ;
120 assert (source.get_mg()->get_type_r(nz-1) == UNSURR) ;
121 for (
int l=num_front+1 ; l<nz-1 ; l++)
122 assert(source.get_mg()->get_type_r(l) == FIN) ;
124 assert (source.get_etat() != ETATNONDEF) ;
125 assert (limite.get_etat() != ETATNONDEF) ;
127 assert ((dzpuis==4) || (dzpuis==2) || (dzpuis==3)) ;
128 assert ((type_raccord == 1) || (type_raccord == 2)|| (type_raccord == 3)) ;
131 const Base_val& base = source.base ;
136 double alpha, beta, echelle ;
137 int l_quant, m_quant;
148 Mtbl_cf solution_part(source.get_mg(), base) ;
149 Mtbl_cf solution_hom_un(source.get_mg(), base) ;
150 Mtbl_cf solution_hom_deux(source.get_mg(), base) ;
151 Mtbl_cf resultat(source.get_mg(), base) ;
153 solution_part.set_etat_qcq() ;
154 solution_hom_un.set_etat_qcq() ;
155 solution_hom_deux.set_etat_qcq() ;
156 resultat.set_etat_qcq() ;
158 for (
int l=0 ; l<nz ; l++) {
159 solution_part.t[l]->set_etat_qcq() ;
160 solution_hom_un.t[l]->set_etat_qcq() ;
161 solution_hom_deux.t[l]->set_etat_qcq() ;
162 resultat.t[l]->set_etat_qcq() ;
163 for (
int k=0 ; k<source.get_mg()->get_np(l)+2 ; k++)
164 for (
int j=0 ; j<source.get_mg()->get_nt(l) ; j++)
165 for (
int i=0 ; i<source.get_mg()->get_nr(l) ; i++)
166 resultat.set(l, k, j, i) = 0 ;
178 nr = source.get_mg()->get_nr(nz-1) ;
179 nt = source.get_mg()->get_nt(nz-1) ;
180 np = source.get_mg()->get_np(nz-1) ;
182 if (np > np_max) np_max = np ;
183 if (nt > nt_max) nt_max = nt ;
185 alpha = mapping.get_alpha()[nz-1] ;
186 beta = mapping.get_beta()[nz-1] ;
188 for (
int k=0 ; k<np+1 ; k++)
189 for (
int j=0 ; j<nt ; j++)
190 if (nullite_plm(j, nt, k, np, base) == 1)
194 donne_lm(nz, nz-1, j, k, base, m_quant, l_quant, base_r) ;
197 operateur =
new Matrice(laplacien_mat(nr, l_quant, 0., dzpuis,
199 (*operateur) = combinaison(*operateur, l_quant, 0., dzpuis, base_r) ;
202 nondege =
new Matrice(prepa_nondege(*operateur, l_quant, 0.,
206 sol_hom =
new Tbl(solh(nr, l_quant, 0., base_r)) ;
211 for (
int i=0 ; i<nr ; i++)
212 so->set(i) = source(nz-1, k, j, i) ;
213 sol_part =
new Tbl(solp(*operateur, *nondege, alpha, beta,
214 *so, dzpuis, base_r)) ;
217 for (
int i=0 ; i<nr ; i++) {
218 solution_part.set(nz-1, k, j, i) = (*sol_part)(i) ;
219 solution_hom_un.set(nz-1, k, j, i) = (*sol_hom)(i) ;
220 solution_hom_deux.set(nz-1, k, j, i) = 0. ;
234 for (
int zone=num_front+1 ; zone<nz-1 ; zone++) {
235 nr = source.get_mg()->get_nr(zone) ;
236 nt = source.get_mg()->get_nt(zone) ;
237 np = source.get_mg()->get_np(zone) ;
239 if (np > np_max) np_max = np ;
240 if (nt > nt_max) nt_max = nt ;
242 alpha = mapping.get_alpha()[zone] ;
243 beta = mapping.get_beta()[zone] ;
245 for (
int k=0 ; k<np+1 ; k++)
246 for (
int j=0 ; j<nt ; j++)
247 if (nullite_plm(j, nt, k, np, base) == 1)
250 donne_lm(nz, zone, j, k, base, m_quant, l_quant, base_r) ;
253 operateur =
new Matrice(laplacien_mat
254 (nr, l_quant, beta/alpha, 0, base_r)) ;
256 (*operateur) = combinaison(*operateur, l_quant, beta/alpha, 0,
260 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
261 beta/alpha, 0, base_r)) ;
264 sol_hom =
new Tbl(solh(nr, l_quant, beta/alpha, base_r)) ;
269 for (
int i=0 ; i<nr ; i++)
270 so->set(i) = source(zone, k, j, i) ;
272 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
273 beta, *so, 0, base_r)) ;
277 for (
int i=0 ; i<nr ; i++) {
278 solution_part.set(zone, k, j, i) = (*sol_part)(i) ;
279 solution_hom_un.set(zone, k, j, i) = (*sol_hom)(0, i) ;
280 solution_hom_deux.set(zone, k, j, i) = (*sol_hom)(1, i) ;
296 nr = source.get_mg()->get_nr(num_front+1) ;
297 nt = source.get_mg()->get_nt(num_front+1) ;
298 np = source.get_mg()->get_np(num_front+1) ;
302 alpha = mapping.get_alpha()[num_front+1] ;
303 beta = mapping.get_beta()[num_front+1] ;
304 echelle = beta/alpha ;
306 for (
int k=0 ; k<np+1 ; k++)
307 for (
int j=0 ; j<nt ; j++)
308 if (nullite_plm(j, nt, k, np, base) == 1)
311 donne_lm(nz, num_front+1, j, k, base, m_quant, l_quant, base_r) ;
313 switch (type_raccord) {
318 for (
int i=0 ; i<nr ; i++)
320 somme += solution_part(num_front+1, k, j, i) ;
322 somme -= solution_part(num_front+1, k, j, i) ;
323 facteur = (limite(num_front, k, j, 0)-somme)
324 *
pow(echelle-1, l_quant+1) ;
326 for (
int i=0 ; i<nr ; i++)
327 solution_part.
set(num_front+1, k, j, i) +=
328 facteur*solution_hom_deux(num_front+1, k, j, i) ;
331 facteur = -
pow(echelle-1, 2*l_quant+1) ;
332 for (
int i=0 ; i<nr ; i++)
333 solution_hom_un.set(num_front+1, k, j, i) +=
334 facteur*solution_hom_deux(num_front+1, k, j, i) ;
342 for (
int i=0 ; i<nr ; i++)
344 somme -= i*i/alpha*solution_part(num_front+1, k, j, i) ;
346 somme += i*i/alpha*solution_part(num_front+1, k, j, i) ;
347 facteur = (somme-limite(num_front, k, j, 0))
348 * alpha*
pow(echelle-1, l_quant+2)/(l_quant+1) ;
349 for (
int i=0 ; i<nr ; i++)
350 solution_part.
set(num_front+1, k, j, i) +=
351 facteur*solution_hom_deux(num_front+1, k, j, i) ;
354 facteur =
pow(echelle-1, 2*l_quant+1)*l_quant/(l_quant+1) ;
355 for (
int i=0 ; i<nr ; i++)
356 solution_hom_un.
set(num_front+1, k, j, i) +=
357 facteur*solution_hom_deux(num_front+1, k, j, i) ;
363 for (
int i=0 ; i<nr ; i++)
365 somme += solution_part(num_front+1, k, j, i) *
366 fact_dir - fact_neu *
367 i*i/alpha*solution_part(num_front+1, k, j, i) ;
369 somme += - solution_part(num_front+1, k, j, i) *
370 fact_dir + fact_neu *
371 i*i/alpha*solution_part(num_front+1, k, j, i) ;
374 somme2 = fact_dir *
pow(echelle-1, -l_quant-1) -
375 fact_neu/alpha*
pow(echelle-1, -l_quant-2)*(l_quant+1) ;
377 facteur = (limite(num_front, k, j, 0)- somme) / somme2 ;
379 for (
int i=0 ; i<nr ; i++)
380 solution_part.
set(num_front+1, k, j, i) +=
381 facteur*solution_hom_deux(num_front+1, k, j, i) ;
385 somme1 = fact_dir *
pow(echelle-1, l_quant) +
386 fact_neu / alpha *
pow(echelle-1, l_quant-1) *
388 facteur = - somme1 / somme2 ;
389 for (
int i=0 ; i<nr ; i++)
390 solution_hom_un.
set(num_front+1, k, j, i) +=
391 facteur*solution_hom_deux(num_front+1, k, j, i) ;
396 cout <<
"Diantres nous ne devrions pas etre ici ! " << endl ;
402 for (
int i=0 ; i<nr ; i++)
403 solution_hom_deux.set(num_front+1, k, j, i) = 0 ;
414 int * indic =
new int [nz] ;
426 int sup_new, inf_new ;
429 for (
int k=0 ; k<np_max+1 ; k++)
430 for (
int j=0 ; j<nt_max ; j++)
431 if (nullite_plm(j, nt_max, k, np_max, base) == 1) {
438 for (
int zone=num_front+1 ; zone<nz ; zone++)
439 indic[zone] = nullite_plm(j, source.get_mg()->get_nt(zone),
440 k, source.get_mg()->get_np(zone), base);
443 taille = indic[nz-1]+indic[num_front+1] ;
444 for (
int zone=num_front+2 ; zone<nz-1 ; zone++)
445 taille+=2*indic[zone] ;
452 sec_membre =
new Tbl(taille) ;
453 sec_membre->set_etat_qcq() ;
454 for (
int l=0 ; l<taille ; l++)
455 sec_membre->set(l) = 0 ;
457 systeme =
new Matrice(taille, taille) ;
458 systeme->set_etat_qcq() ;
459 for (
int l=0 ; l<taille ; l++)
460 for (
int c=0 ; c<taille ; c++)
461 systeme->set(l, c) = 0 ;
467 donne_lm (nz, 0, j, k, base, m_quant, l_quant, base_r) ;
474 if (indic[num_front+1] == 1) {
475 nr = source.get_mg()->get_nr(num_front+1) ;
477 alpha = mapping.get_alpha()[num_front+1] ;
478 beta = mapping.get_beta()[num_front+1] ;
479 echelle = beta/alpha ;
483 for (
int i=0 ; i<nr ; i++)
484 somme += solution_hom_un (num_front+1, k, j, i) ;
485 systeme->set(ligne, colonne) = somme ;
488 for (
int i=0 ; i<nr ; i++)
489 sec_membre->set(ligne) -= solution_part(num_front+1, k, j, i) ;
495 if (indic[num_front+1] == 1) {
499 for (
int i=0 ; i<nr ; i++)
501 solution_hom_un(num_front+1, k, j, i) ;
502 systeme->set(ligne, colonne) = somme ;
505 for (
int i=0 ; i<nr ; i++)
506 sec_membre->set(ligne) -= i*i/alpha
507 *solution_part(num_front+1, k, j, i) ;
519 for (
int zone=num_front+2 ; zone<nz-1 ; zone++)
520 if (indic[zone] == 1) {
522 nr = source.get_mg()->get_nr(zone) ;
523 alpha = mapping.get_alpha()[zone] ;
524 echelle = mapping.get_beta()[zone]/alpha ;
527 if (indic[zone-1] == 1) ligne -- ;
530 systeme->set(ligne, colonne) =
531 -
pow(echelle-1,
double(l_quant)) ;
534 systeme->set(ligne, colonne+1) =
535 -1/
pow(echelle-1,
double(l_quant+1)) ;
538 for (
int i=0 ; i<nr ; i++)
540 sec_membre->set(ligne) += solution_part(zone, k, j, i) ;
541 else sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
544 sup_new = colonne+1-ligne ;
545 if (sup_new > sup) sup = sup_new ;
552 if (indic[zone-1] == 1) {
554 systeme->set(ligne, colonne) =
555 -l_quant*
pow(echelle-1,
double(l_quant-1))/alpha ;
557 systeme->
set(ligne, colonne+1) =
558 (l_quant+1)/
pow(echelle-1,
double(l_quant+2))/alpha ;
563 for (
int i=0 ; i<nr ; i++)
565 sec_membre->
set(ligne) -=
566 i*i/alpha*solution_part(zone, k, j, i) ;
568 sec_membre->set(ligne) +=
569 i*i/alpha*solution_part(zone, k, j, i) ;
572 sup_new = colonne+1-ligne ;
573 if (sup_new > sup) sup = sup_new ;
580 systeme->set(ligne, colonne) =
581 pow(echelle+1,
double(l_quant)) ;
584 systeme->set(ligne, colonne+1) =
585 1/
pow(echelle+1,
double(l_quant+1)) ;
588 for (
int i=0 ; i<nr ; i++)
589 sec_membre->set(ligne) -= solution_part(zone, k, j, i) ;
592 inf_new = ligne-colonne ;
593 if (inf_new > inf) inf = inf_new ;
599 if (indic[zone+1] == 1) {
602 systeme->set(ligne, colonne) =
603 l_quant*
pow(echelle+1,
double(l_quant-1))/alpha ;
606 systeme->
set(ligne, colonne+1) =
607 -(l_quant+1)/
pow(echelle+1,
double(l_quant+2))/alpha ;
610 for (
int i=0 ; i<nr ; i++)
611 sec_membre->
set(ligne) -=
612 i*i/alpha*solution_part(zone, k, j, i) ;
615 inf_new = ligne-colonne ;
616 if (inf_new > inf) inf = inf_new ;
627 if (indic[nz-1] == 1) {
629 nr = source.get_mg()->get_nr(nz-1) ;
632 alpha = mapping.get_alpha()[nz-1] ;
634 if (indic[nz-2] == 1) ligne -- ;
637 systeme->set(ligne, colonne) = -
pow(-2,
double(l_quant+1)) ;
639 for (
int i=0 ; i<nr ; i++)
641 sec_membre->set(ligne) += solution_part(nz-1, k, j, i) ;
642 else sec_membre->set(ligne) -= solution_part(nz-1, k, j, i) ;
645 if (indic[nz-2] == 1) {
648 systeme->set(ligne+1, colonne) =
649 alpha*(l_quant+1)*
pow(-2.,
double(l_quant+2)) ;
652 for (
int i=0 ; i<nr ; i++)
654 sec_membre->
set(ligne+1) -=
655 -4*alpha*i*i*solution_part(nz-1, k, j, i) ;
657 sec_membre->set(ligne+1) +=
658 -4*alpha*i*i*solution_part(nz-1, k, j, i) ;
661 if (sup == 0) sup = 1 ;
669 systeme->set_band(sup, inf) ;
672 Tbl facteurs(systeme->inverse(*sec_membre)) ;
678 if (indic[num_front+1] == 1) {
679 nr = source.get_mg()->get_nr(num_front+1) ;
680 for (
int i=0 ; i<nr ; i++)
681 resultat.set(num_front+1, k, j, i) =
682 solution_part(num_front+1, k, j, i)
683 +facteurs(conte)*solution_hom_un(num_front+1, k, j, i) ;
688 for (
int zone=num_front+2 ; zone<nz-1 ; zone++)
689 if (indic[zone] == 1) {
690 nr = source.get_mg()->get_nr(zone) ;
691 for (
int i=0 ; i<nr ; i++)
692 resultat.set(zone, k, j, i) =
693 solution_part(zone, k, j, i)
694 +facteurs(conte)*solution_hom_un(zone, k, j, i)
695 +facteurs(conte+1)*solution_hom_deux(zone, k, j, i) ;
700 if (indic[nz-1] == 1) {
701 nr = source.get_mg()->get_nr(nz-1) ;
702 for (
int i=0 ; i<nr ; i++)
703 resultat.set(nz-1, k, j, i) =
704 solution_part(nz-1, k, j, i)
705 +facteurs(conte)*solution_hom_un(nz-1, k, j, i) ;
717 for (
int l=0 ; l<num_front+1 ; l++)
718 resultat.t[l]->set_etat_zero() ;
const Mg3d * get_mg() const
Returns the Mg3d on which the Mtbl_cf is defined.
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.